author | Chuangcheng Peng <chuangcheng.peng@amlogic.com> | 2020-02-25 10:10:18 (GMT) |
---|---|---|
committer | Chuangcheng Peng <chuangcheng.peng@amlogic.com> | 2020-03-10 03:14:12 (GMT) |
commit | 408cbeeada0c1a1f3ac91ae9ffda659f97cda562 (patch) | |
tree | fb860f6320123b02a37c4e9657833fc1074253ad | |
parent | 0548bdac0018109e546443d39b301fb7eecb82a6 (diff) | |
download | media_modules-408cbeeada0c1a1f3ac91ae9ffda659f97cda562.zip media_modules-408cbeeada0c1a1f3ac91ae9ffda659f97cda562.tar.gz media_modules-408cbeeada0c1a1f3ac91ae9ffda659f97cda562.tar.bz2 |
demux: update 4.9 to 5.4 [1/1]
PD#SWPL-19089
Problem:
support 5.4 kernel
Solution:
update amlogic-4.9-dev code match with 5.4 kernel
Verify:
verify at ac214
Change-Id: I3826523834cb6f5668fe99def3155a0b0b082fed
Signed-off-by: Chuangcheng Peng <chuangcheng.peng@amlogic.com>
31 files changed, 662 insertions, 453 deletions
diff --git a/drivers/stream_input/Makefile b/drivers/stream_input/Makefile index 73dfd13..1262e96 100644 --- a/drivers/stream_input/Makefile +++ b/drivers/stream_input/Makefile @@ -10,7 +10,14 @@ stream_input-objs += parser/psparser.o stream_input-objs += parser/rmparser.o stream_input-objs += subtitle/subtitle.o +stream_input-objs += parser/dvb_common.o obj-$(CONFIG_AMLOGIC_DVB) += parser/hw_demux/ +obj-$(CONFIG_AMLOGIC_DVB) += parser/demux/ +obj-$(CONFIG_AMLOGIC_DVB) += parser/dvb_ci/ + +ccflags-y += -I. +ccflags-y += -I$(srctree)/include/media + #obj-y += tv_frontend/ # obj-y += box-frontend/avl6211/ # obj-y += box-frontend/atbm8881/ diff --git a/drivers/stream_input/parser/demux/Makefile b/drivers/stream_input/parser/demux/Makefile index c0df578..1796d5b 100644 --- a/drivers/stream_input/parser/demux/Makefile +++ b/drivers/stream_input/parser/demux/Makefile @@ -1,6 +1,6 @@ obj-m += aml_swdmx.o -ccflags-y += -I$(srctree)/drivers/media/dvb-core -I$(srctree)/drivers/gpio -I$(srctree)/include +ccflags-y += -I$(srctree)/include/media -I$(srctree)/drivers/media/pci/ttpci -I$(srctree)/drivers/gpio -I$(srctree)/include aml_swdmx-objs += aml_dvb.o aml_swdmx-objs += aml_dsc.o diff --git a/drivers/stream_input/parser/demux/aml_dmx.c b/drivers/stream_input/parser/demux/aml_dmx.c index a5aa41d..cb9e541 100644 --- a/drivers/stream_input/parser/demux/aml_dmx.c +++ b/drivers/stream_input/parser/demux/aml_dmx.c @@ -41,7 +41,7 @@ #include <linux/crc32.h> #include <asm/uaccess.h> #include <asm/div64.h> - +#include <linux/sched/signal.h> //#include "aml_dvb.h" #include "aml_dmx.h" #include "aml_dmx_ext.h" @@ -223,7 +223,7 @@ static void _ts_pkt_cb (SWDMX_TsPacket *pkt, SWDMX_Ptr data) return ; } if (ts_feed->ts_cb) { - ts_feed->ts_cb(pkt->packet,pkt->packet_len,NULL,0,source_feed); + ts_feed->ts_cb(pkt->packet,pkt->packet_len,NULL,0,source_feed,0); } } static void _sec_cb (SWDMX_UInt8 *sec, SWDMX_Int len, SWDMX_Ptr data) @@ -238,13 +238,12 @@ static void _sec_cb (SWDMX_UInt8 *sec, SWDMX_Int len, SWDMX_Ptr data) } if (sec_feed->sec_cb) { - sec_feed->sec_cb(sec,len,NULL, 0,source_filter); + sec_feed->sec_cb(sec,len,NULL, 0,source_filter,0); } } static int _dmx_ts_feed_set(struct dmx_ts_feed *ts_feed, u16 pid, int ts_type, - enum dmx_ts_pes pes_type, - size_t circular_buffer_size, ktime_t timeout) + enum dmx_ts_pes pes_type, ktime_t timeout) { struct sw_demux_ts_feed *feed = (struct sw_demux_ts_feed *)ts_feed; struct aml_dmx *demux = (struct aml_dmx *)ts_feed->parent->priv; @@ -391,8 +390,7 @@ static int _dmx_section_feed_allocate_filter(struct dmx_section_feed *feed, } static int _dmx_section_feed_set(struct dmx_section_feed *feed, - u16 pid, size_t circular_buffer_size, - int check_crc) + u16 pid, int check_crc) { struct sw_demux_sec_feed *sec_feed = (struct sw_demux_sec_feed *)feed; struct aml_dmx *demux = (struct aml_dmx *)feed->parent->priv; diff --git a/drivers/stream_input/parser/demux/aml_dmx.h b/drivers/stream_input/parser/demux/aml_dmx.h index 1246bc2..b75b22d 100644 --- a/drivers/stream_input/parser/demux/aml_dmx.h +++ b/drivers/stream_input/parser/demux/aml_dmx.h @@ -22,7 +22,7 @@ #include "sw_demux/swdemux.h" #include "hw_demux/hwdemux.h" -#include "demux.h" +//#include "demux.h" #include "dvbdev.h" #include <dmxdev.h> diff --git a/drivers/stream_input/parser/demux/aml_dsc.c b/drivers/stream_input/parser/demux/aml_dsc.c index 636ceea..032c5e7 100644 --- a/drivers/stream_input/parser/demux/aml_dsc.c +++ b/drivers/stream_input/parser/demux/aml_dsc.c @@ -799,7 +799,7 @@ static int _dvb_dsc_open(struct inode *inode, struct file *file) return 0; } -static int _dsc_set_pid(struct aml_dsc *dsc, ca_pid_t *pi) { +static int _dsc_set_pid(struct aml_dsc *dsc, struct ca_pid *pi) { int i; struct DescChannel *ch; int ret = 0; @@ -848,7 +848,7 @@ static int _dvb_dsc_do_ioctl(struct file *file, unsigned int cmd, _dsc_reset(dsc); break; case CA_GET_CAP: { - ca_caps_t *cap = parg; + struct ca_caps *cap = parg; cap->slot_num = 1; cap->slot_type = CA_DESCR; @@ -857,7 +857,7 @@ static int _dvb_dsc_do_ioctl(struct file *file, unsigned int cmd, break; } case CA_GET_SLOT_INFO: { - ca_slot_info_t *slot = parg; + struct ca_slot_info *slot = parg; slot->num = 1; slot->type = CA_DESCR; @@ -865,14 +865,14 @@ static int _dvb_dsc_do_ioctl(struct file *file, unsigned int cmd, break; } case CA_GET_DESCR_INFO: { - ca_descr_info_t *descr = parg; + struct ca_descr_info *descr = parg; descr->num = DSC_CHANNEL_NUM; descr->type = 0; break; } case CA_SET_DESCR: { - ca_descr_t *d = parg; + struct ca_descr *d = parg; struct ca_descr_ex dex; dex.index = d->index; @@ -884,7 +884,7 @@ static int _dvb_dsc_do_ioctl(struct file *file, unsigned int cmd, break; } case CA_SET_PID: { - ca_pid_t *pi = parg; + struct ca_pid *pi = parg; ret = _dsc_set_pid(dsc,pi); diff --git a/drivers/stream_input/parser/demux/aml_dsc.h b/drivers/stream_input/parser/demux/aml_dsc.h index 14ae6fa..2b758fa 100644 --- a/drivers/stream_input/parser/demux/aml_dsc.h +++ b/drivers/stream_input/parser/demux/aml_dsc.h @@ -25,6 +25,7 @@ #include <dmxdev.h> #include <linux/device.h> #include "hw_demux/s2p.h" +#include "../dvb_common.h" #define SW_DSC_MODE 0 #define HW_DSC_MODE 1 diff --git a/drivers/stream_input/parser/demux/aml_dvb.c b/drivers/stream_input/parser/demux/aml_dvb.c index 8c4df62..8ae14e5 100644 --- a/drivers/stream_input/parser/demux/aml_dvb.c +++ b/drivers/stream_input/parser/demux/aml_dvb.c @@ -49,9 +49,9 @@ DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); -extern ssize_t stb_show_tuner_setting(struct class *class, +extern ssize_t tuner_setting_show(struct class *class, struct class_attribute *attr, char *buf); -extern ssize_t stb_store_tuner_setting(struct class *class, +extern ssize_t tuner_setting_store(struct class *class, struct class_attribute *attr, const char *buf, size_t count); @@ -67,7 +67,7 @@ typedef struct _ChainPath static ChainPath DmxChainPath[MAX_DMXCHAINPATH_NUM]; #define DSC_MODE_FUNC_DECL(i)\ -static ssize_t dsc##i##_store_mode(struct class *class,\ +static ssize_t dsc##i##_mode_store(struct class *class,\ struct class_attribute *attr, const char *buf,size_t size) {\ if (!strncmp("sw", buf, 2)) {\ dsc_set_mode(&aml_dvb_device.dsc[i], SW_DSC_MODE);\ @@ -76,7 +76,7 @@ static ssize_t dsc##i##_store_mode(struct class *class,\ }\ return 0;\ }\ -static ssize_t dsc##i##_show_mode(struct class *class,\ +static ssize_t dsc##i##_mode_show(struct class *class,\ struct class_attribute *attr, char *buf) {\ int mode = 0;\ char *str ;\ @@ -94,7 +94,7 @@ static ssize_t dsc##i##_show_mode(struct class *class,\ } #define DSC_PATH_FUNC_DECL(i) \ -static ssize_t dsc##i##_store_path(struct class *class,\ +static ssize_t dsc##i##_path_store(struct class *class,\ struct class_attribute *attr, const char *buf,\ size_t size) {\ struct aml_dvb *dvb = &aml_dvb_device;\ @@ -122,7 +122,7 @@ ERROR:\ pr_error("error, such as path=0,link=1");\ return 0;\ }\ -static ssize_t dsc##i##_show_path(struct class *class,\ +static ssize_t dsc##i##_path_show(struct class *class,\ struct class_attribute *attr, char *buf) {\ int n = 0;\ int dsc_id = -1;\ @@ -143,7 +143,7 @@ static ssize_t dsc##i##_show_path(struct class *class,\ } #define CHAIN_PATH_FUNC_DECL(i)\ -ssize_t chain_path##i##_store_source(struct class *class,\ +ssize_t path##i##_source_store(struct class *class,\ struct class_attribute *attr, const char *buf,\ size_t size)\ {\ @@ -178,7 +178,7 @@ ssize_t chain_path##i##_store_source(struct class *class,\ }\ return size;\ }\ -ssize_t chain_path##i##_show_source(struct class *class,\ +ssize_t path##i##_source_show(struct class *class,\ struct class_attribute *attr, char *buf)\ {\ struct aml_dvb *dvb = aml_get_dvb_device();\ @@ -224,7 +224,7 @@ ssize_t chain_path##i##_show_source(struct class *class,\ } #define WORK_MODE_FUNC_DECL(i)\ -ssize_t chain_path##i##_store_work_mode(struct class *class,\ +ssize_t path##i##_work_mode_store(struct class *class,\ struct class_attribute *attr, const char *buf,\ size_t size)\ {\ @@ -241,7 +241,7 @@ ssize_t chain_path##i##_store_work_mode(struct class *class,\ dmx_set_work_mode(&dvb->dmx[i], mode);\ return size;\ }\ -ssize_t chain_path##i##_show_work_mode(struct class *class,\ +ssize_t path##i##_work_mode_show(struct class *class,\ struct class_attribute *attr, char *buf)\ {\ struct aml_dvb *dvb = aml_get_dvb_device();\ @@ -269,7 +269,7 @@ ssize_t chain_path##i##_show_work_mode(struct class *class,\ } #define PATH_BUFF_STATUS_FUNC_DECL(i)\ -ssize_t path##i##_set_buf_warning_level(struct class *class,\ +ssize_t path##i##_buf_status_store(struct class *class,\ struct class_attribute *attr, const char *buf,\ size_t size)\ {\ @@ -288,7 +288,7 @@ ssize_t path##i##_set_buf_warning_level(struct class *class,\ }\ return size;\ }\ -ssize_t path##i##_show_buf_warning_status(struct class *class,\ +ssize_t path##i##_buf_status_show(struct class *class,\ struct class_attribute *attr, char *buf)\ {\ struct aml_dvb *dvb = aml_get_dvb_device();\ @@ -333,30 +333,42 @@ WORK_MODE_FUNC_DECL(1) PATH_BUFF_STATUS_FUNC_DECL(0) PATH_BUFF_STATUS_FUNC_DECL(1) -static struct class_attribute aml_dvb_class_attrs[] = { - __ATTR(path0_source, 0664, chain_path0_show_source, - chain_path0_store_source), - __ATTR(path1_source, 0664, chain_path1_show_source, - chain_path1_store_source), - __ATTR(dsc0_mode, 0664, dsc0_show_mode,dsc0_store_mode), - __ATTR(dsc1_mode, 0664, dsc1_show_mode,dsc1_store_mode), - __ATTR(dsc0_path, 0664, dsc0_show_path,dsc0_store_path), - __ATTR(dsc1_path, 0664, dsc1_show_path,dsc1_store_path), - __ATTR(path0_work_mode, 0664, chain_path0_show_work_mode,\ - chain_path0_store_work_mode), - __ATTR(path1_work_mode, 0664, chain_path1_show_work_mode,\ - chain_path1_store_work_mode), - __ATTR(path0_buf_status, 0664, path0_show_buf_warning_status,\ - path0_set_buf_warning_level), - __ATTR(path1_buf_status, 0664, path1_show_buf_warning_status,\ - path1_set_buf_warning_level),\ - __ATTR(tuner_setting, 0664, stb_show_tuner_setting, stb_store_tuner_setting), - __ATTR_NULL +static CLASS_ATTR_RW(path0_source); +static CLASS_ATTR_RW(path1_source); +static CLASS_ATTR_RW(dsc0_mode); +static CLASS_ATTR_RW(dsc1_mode); +static CLASS_ATTR_RW(dsc0_path); +static CLASS_ATTR_RW(dsc1_path); +static CLASS_ATTR_RW(path0_work_mode); +static CLASS_ATTR_RW(path1_work_mode); +static CLASS_ATTR_RW(path0_buf_status); +static CLASS_ATTR_RW(path1_buf_status); +static CLASS_ATTR_RW(tuner_setting); + +#define DVB_ATTR(name) &class_attr_##name.attr + +static struct attribute *aml_dvb_class_attrs[] = { + DVB_ATTR(path0_source), + DVB_ATTR(path1_source), + DVB_ATTR(dsc0_mode), + DVB_ATTR(dsc1_mode), + DVB_ATTR(dsc0_path), + DVB_ATTR(dsc1_path), + DVB_ATTR(path0_work_mode), + DVB_ATTR(path1_work_mode), + DVB_ATTR(path0_buf_status), + DVB_ATTR(path1_buf_status), + DVB_ATTR(tuner_setting), + NULL }; + +ATTRIBUTE_GROUPS(aml_dvb_class); + + static struct class aml_dvb_class = { .name = "stb", - .class_attrs = aml_dvb_class_attrs, + .class_groups = aml_dvb_class_groups, }; static void dmx_chain_path_init(void) { diff --git a/drivers/stream_input/parser/demux/aml_dvb.h b/drivers/stream_input/parser/demux/aml_dvb.h index 539025d..42540eb 100644 --- a/drivers/stream_input/parser/demux/aml_dvb.h +++ b/drivers/stream_input/parser/demux/aml_dvb.h @@ -30,7 +30,6 @@ #define DSC_DEV_COUNT 2 #define FE_DEV_COUNT 2 - struct aml_dvb { struct dvb_device dvb_dev; struct dvb_adapter dvb_adapter; diff --git a/drivers/stream_input/parser/demux/hw_demux/asyncfifo.c b/drivers/stream_input/parser/demux/hw_demux/asyncfifo.c index 569d63c..b5033c0 100644 --- a/drivers/stream_input/parser/demux/hw_demux/asyncfifo.c +++ b/drivers/stream_input/parser/demux/hw_demux/asyncfifo.c @@ -304,9 +304,9 @@ loop: } return 0; } -static void timer_asyncfifo_func(unsigned long arg) +static void timer_asyncfifo_func(struct timer_list * timer) { - struct aml_asyncfifo *afifo = (struct aml_asyncfifo *)arg; + struct aml_asyncfifo *afifo = from_timer(afifo,timer,asyncfifo_timer); HWDMX_Demux *pdmx; struct aml_dvb *dvb = afifo->dvb; u32 start_addr; @@ -425,12 +425,17 @@ static int _async_fifo_init(struct aml_asyncfifo *afifo, int initirq, pr_error("create asyncfifo task fail\n"); } afifo->flush_time_ms = asyncfifo_flush_time; + +#if 0 init_timer(&afifo->asyncfifo_timer); afifo->asyncfifo_timer.function = timer_asyncfifo_func; afifo->asyncfifo_timer.expires = jiffies + msecs_to_jiffies(afifo->flush_time_ms); afifo->asyncfifo_timer.data = (unsigned long)afifo; add_timer(&afifo->asyncfifo_timer); +#endif + + timer_setup(&afifo->asyncfifo_timer, timer_asyncfifo_func,0); /*alloc buffer*/ ret = _asyncfifo_set_buffer(afifo, buf_len, buf); diff --git a/drivers/stream_input/parser/demux/hw_demux/frontend.c b/drivers/stream_input/parser/demux/hw_demux/frontend.c index e648c4d..0e0e978 100644 --- a/drivers/stream_input/parser/demux/hw_demux/frontend.c +++ b/drivers/stream_input/parser/demux/hw_demux/frontend.c @@ -57,7 +57,7 @@ static enum dtv_demod_type s_demod_type[FE_DEV_COUNT] = {AM_DTV_DEMOD_NONE, AM_D static enum tuner_type s_tuner_type[FE_DEV_COUNT] = {AM_TUNER_NONE, AM_TUNER_NONE}; -ssize_t stb_show_tuner_setting(struct class *class, +ssize_t tuner_setting_show(struct class *class, struct class_attribute *attr, char *buf) { struct aml_dvb *dvb = aml_get_dvb_device(); @@ -71,7 +71,7 @@ ssize_t stb_show_tuner_setting(struct class *class, return 0; } -ssize_t stb_store_tuner_setting(struct class *class, +ssize_t tuner_setting_store(struct class *class, struct class_attribute *attr, const char *buf, size_t count) { diff --git a/drivers/stream_input/parser/demux/hw_demux/hwdemux.c b/drivers/stream_input/parser/demux/hw_demux/hwdemux.c index 1577cb3..1871939 100644 --- a/drivers/stream_input/parser/demux/hw_demux/hwdemux.c +++ b/drivers/stream_input/parser/demux/hw_demux/hwdemux.c @@ -40,7 +40,7 @@ #include <linux/poll.h> #include <linux/crc32.h> #include <linux/clk.h> - +#include <linux/of_irq.h> #include <asm/uaccess.h> #include <asm/div64.h> @@ -1012,8 +1012,8 @@ int hwdmx_probe(struct platform_device *pdev){ u32 value; int i = 0; int ret = 0; - struct resource *res; struct aml_dvb *advb = aml_get_dvb_device(); + struct device_node *node_dmx = NULL; _hwdmx_get_base_addr(pdev); @@ -1028,14 +1028,20 @@ int hwdmx_probe(struct platform_device *pdev){ pr_inf("%s: 0x%x\n", buf, value); advb->ts_out_invert = value; } - for (i = 0; i < DEMUX_COUNT; i++) { - Demux[i].dmx_irq = -1; - snprintf(buf, sizeof(buf), "demux%d_irq", i); - res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, buf); - if (res) - Demux[i].dmx_irq = res->start; - - pr_error("%s irq num:%d \r\n", buf, Demux[i].dmx_irq); + memset(buf, 0, 32); + snprintf(buf, sizeof(buf), "dmx"); + node_dmx = of_parse_phandle(advb->pdev->dev.of_node, buf, 0); + if (node_dmx) { + for (i = 0; i < DEMUX_COUNT; i++) { + Demux[i].dmx_irq = -1; + memset(buf, 0, 32); + snprintf(buf, sizeof(buf), "demux%d_irq", i); + ret = of_irq_get_byname(node_dmx, buf); + if (ret > 0) + Demux[i].dmx_irq = ret; + + pr_error("%s irq num:%d \r\n", buf, Demux[i].dmx_irq); + } } frontend_probe(pdev); s2p_probe(pdev); diff --git a/drivers/stream_input/parser/demux/hw_demux/hwdemux.h b/drivers/stream_input/parser/demux/hw_demux/hwdemux.h index da2e6c7..6cfe83f 100644 --- a/drivers/stream_input/parser/demux/hw_demux/hwdemux.h +++ b/drivers/stream_input/parser/demux/hw_demux/hwdemux.h @@ -20,14 +20,15 @@ #ifndef _AML_HWDMX_H_ #define _AML_HWDMX_H_ #include <linux/dvb/dmx.h> - +#include "../../dvb_common.h" +#if 0 enum aml_dmx_id_t { AM_DMX_0 = 0, AM_DMX_1, AM_DMX_2, AM_DMX_MAX, }; - +#endif typedef struct HWDMX_Demux_s HWDMX_Demux; typedef struct HWDMX_Chan_s HWDMX_Chan; typedef int (*HWDMX_Cb)(char *buf, int count, void *udata); diff --git a/drivers/stream_input/parser/demux/hw_demux/s2p.h b/drivers/stream_input/parser/demux/hw_demux/s2p.h index a5e8e8e..d671e1f 100644 --- a/drivers/stream_input/parser/demux/hw_demux/s2p.h +++ b/drivers/stream_input/parser/demux/hw_demux/s2p.h @@ -20,22 +20,6 @@ #ifndef _S2P_H_ #define _S2P_H_ -enum aml_ts_source_t { - AM_TS_SRC_TS0, - AM_TS_SRC_TS1, - AM_TS_SRC_TS2, - AM_TS_SRC_TS3, - - AM_TS_SRC_S_TS0, - AM_TS_SRC_S_TS1, - AM_TS_SRC_S_TS2, - - AM_TS_SRC_HIU, - AM_TS_SRC_DMX0, - AM_TS_SRC_DMX1, - AM_TS_SRC_DMX2 -}; - enum{ AM_TS_DISABLE, AM_TS_PARALLEL, diff --git a/drivers/stream_input/parser/demux/sw_demux/dvbcsa2/Makefile.bak b/drivers/stream_input/parser/demux/sw_demux/dvbcsa2/Makefile.bak deleted file mode 100755 index 6603c63..0000000 --- a/drivers/stream_input/parser/demux/sw_demux/dvbcsa2/Makefile.bak +++ b/dev/null @@ -1,13 +0,0 @@ -# -# AMLOGIC sw demux driver -# - -obj-$(AMLOGIC_SWDEMUX_DVBCSA) += dvbcsa_bs_algo.o \ - dvbcsa_algo.o \ - dvbcsa_block.o \ - dvbcsa_bs_block.o \ - dvbcsa_bs_key.o \ - dvbcsa_bs_stream.o \ - dvbcsa_bs_transpose.o \ - dvbcsa_key.o \ - dvbcsa_stream.o diff --git a/drivers/stream_input/parser/dvb_ci/Makefile b/drivers/stream_input/parser/dvb_ci/Makefile index 25cdcb9..ac411fd 100644 --- a/drivers/stream_input/parser/dvb_ci/Makefile +++ b/drivers/stream_input/parser/dvb_ci/Makefile @@ -5,6 +5,7 @@ ci-objs = $(amlci-objs) $(cimcu-objs) $(cimax-objs) amlci-objs = aml_pcmcia.o aml_ci.o aml_spi.o cimcu-objs = cimcu/dvb_ca_en50221_cimcu.o cimax-objs = cimax/dvb_ca_en50221_cimax.o cimax/aml_cimax.o cimax/dvb_ringbuffer.o +KBUILD_CFLAGS += -Wno-implicit-fallthrough cimax-usb-objs += cimax/usb/SRC/cimax+usb-driver.o cimax/usb/SRC/cimax+usb_fw.o cimax-usb-objs += cimax/usb/SRC/cimax+usb_config.o cimax-objs += cimax/aml_cimax_usb.o @@ -13,4 +14,6 @@ ccflags-y += -I$(srctree)/ ccflags-y += -I$(srctree)/include ccflags-y += -I$(srctree)/drivers/gpio ccflags-y += -I$(srctree)/drivers/media/dvb-core +ccflags-y += -I$(srctree)/include/media +ccflags-y += -I$(srctree)/drivers/media/pci/ttpci diff --git a/drivers/stream_input/parser/dvb_ci/aml_ci.c b/drivers/stream_input/parser/dvb_ci/aml_ci.c index d457a05..ada77f6 100644 --- a/drivers/stream_input/parser/dvb_ci/aml_ci.c +++ b/drivers/stream_input/parser/dvb_ci/aml_ci.c @@ -26,6 +26,8 @@ #include <linux/device.h> #include <linux/slab.h> #include <linux/platform_device.h> +#include <linux/sysfs.h> +#include <linux/of.h> #include "aml_ci.h" #include "aml_spi.h" #include "cimax/aml_cimax.h" @@ -621,19 +623,22 @@ void aml_ci_exit(struct aml_ci *ci) static struct aml_ci *ci_dev; -static ssize_t aml_ci_ts_show(struct class *class, +static ssize_t ts_show(struct class *class, struct class_attribute *attr, char *buf) { int ret; ret = sprintf(buf, "ts%d\n", 1); return ret; } +static CLASS_ATTR_RO(ts); -static struct class_attribute amlci_class_attrs[] = { - __ATTR(ts, S_IRUGO | S_IWUSR, aml_ci_ts_show, NULL), - __ATTR_NULL +static struct attribute *aml_ci_attrs[] = { + &class_attr_ts.attr, + NULL }; +ATTRIBUTE_GROUPS(aml_ci); + static int aml_ci_register_class(struct aml_ci *ci) { #define CLASS_NAME_LEN 48 @@ -648,7 +653,7 @@ static int aml_ci_register_class(struct aml_ci *ci) snprintf((char *)clp->name, CLASS_NAME_LEN, "amlci-%d", ci->id); clp->owner = THIS_MODULE; - clp->class_attrs = amlci_class_attrs; + clp->class_groups = aml_ci_groups; ret = class_register(clp); if (ret) kfree(clp->name); diff --git a/drivers/stream_input/parser/dvb_ci/aml_spi.c b/drivers/stream_input/parser/dvb_ci/aml_spi.c index 49498fa..b9defc5 100644 --- a/drivers/stream_input/parser/dvb_ci/aml_spi.c +++ b/drivers/stream_input/parser/dvb_ci/aml_spi.c @@ -31,7 +31,8 @@ #include <linux/gpio/consumer.h> #include <linux/device.h> #include <linux/slab.h> -#include <linux/amlogic/sd.h> +//#include <linux/amlogic/sd.h> +#include <linux/mmc/sd.h> #include <linux/of_irq.h> #include <linux/irq.h> #include "aml_spi.h" @@ -933,8 +934,8 @@ static int aml_spi_get_config_from_dts(struct aml_spi *spi_dev) spi_dev->irq = irq_of_parse_and_map( pdev->dev.of_node, 0); AML_CI_GPIO_IRQ_BASE = spi_dev->irq - val; - pr_dbg("get spi irq : %d 0:%d USEDBASE:%d val:%d\r\n", - spi_dev->irq, INT_GPIO_0, AML_CI_GPIO_IRQ_BASE, val); + pr_dbg("get spi irq : %d USEDBASE:%d val:%d\r\n", + spi_dev->irq, AML_CI_GPIO_IRQ_BASE, val); /*get reset pwd cd1 cd2 gpio pin*/ spi_dev->reset_pin = NULL; ret = spi_get_gpio_by_name(spi_dev, &spi_dev->reset_pin, @@ -1646,7 +1647,7 @@ pr_error("Skipping unknown tupletype:0x%x L:0x%x\n", return 0; } -static ssize_t aml_spi_ci_reset_help(struct class *class, +static ssize_t reset_show(struct class *class, struct class_attribute *attr, char *buf) { int ret; @@ -1654,7 +1655,7 @@ struct class_attribute *attr, char *buf) return ret; } -static ssize_t aml_spi_ci_reset(struct class *class, +static ssize_t reset_store(struct class *class, struct class_attribute *attr, const char *buf, size_t size) { int ret; @@ -1663,7 +1664,7 @@ struct class_attribute *attr, const char *buf, size_t size) return size; } -static ssize_t aml_spi_ci_pwr_help(struct class *class, +static ssize_t pwr_show(struct class *class, struct class_attribute *attr, char *buf) { int ret; @@ -1671,7 +1672,7 @@ struct class_attribute *attr, char *buf) return ret; } -static ssize_t aml_spi_ci_pwr(struct class *class, +static ssize_t pwr_store(struct class *class, struct class_attribute *attr, const char *buf, size_t size) { int ret = 0; @@ -1682,7 +1683,7 @@ struct class_attribute *attr, const char *buf, size_t size) ret = aml_gio_power(&g_spi_dev->pc, enable); return size; } -static ssize_t aml_spi_ci_state_show(struct class *class, +static ssize_t status_show(struct class *class, struct class_attribute *attr, char *buf) { int ret; @@ -1692,7 +1693,7 @@ struct class_attribute *attr, char *buf) return ret; } -static ssize_t aml_spi_ci_irq_show(struct class *class, +static ssize_t irq_show(struct class *class, struct class_attribute *attr, char *buf) { int ret; @@ -1701,7 +1702,7 @@ struct class_attribute *attr, char *buf) return ret; } -static ssize_t aml_spi_io_test_help(struct class *class, +static ssize_t iotest_show(struct class *class, struct class_attribute *attr, char *buf) { int ret; @@ -1710,7 +1711,7 @@ struct class_attribute *attr, char *buf) return ret; } -static ssize_t aml_spi_io_test(struct class *class, +static ssize_t iotest_store(struct class *class, struct class_attribute *attr, const char *buf, size_t size) { int n = 0; @@ -1797,27 +1798,28 @@ retval = aml_ci_mem_write_by_spi(ci, 0, addr, val); kfree(buf_orig); return size; } - -static struct class_attribute aml_spi_class_attrs[] = { - __ATTR(reset, S_IRUGO | S_IWUSR, - aml_spi_ci_reset_help, aml_spi_ci_reset), - __ATTR(pwr, S_IRUGO | S_IWUSR, - aml_spi_ci_pwr_help, aml_spi_ci_pwr), - __ATTR(irq, S_IRUGO | S_IWUSR, - aml_spi_ci_irq_show, NULL), - __ATTR(status, S_IRUGO | S_IWUSR, - aml_spi_ci_state_show, NULL), - __ATTR(iotest, S_IRUGO | S_IWUSR, - aml_spi_io_test_help, aml_spi_io_test), - __ATTR_NULL +static CLASS_ATTR_RW(reset); +static CLASS_ATTR_RW(pwr); +static CLASS_ATTR_RO(irq); +static CLASS_ATTR_RO(status); +static CLASS_ATTR_RW(iotest); + +static struct attribute *aml_spi_class_attrs[] = { + &class_attr_reset.attr, + &class_attr_pwr.attr, + &class_attr_irq.attr, + &class_attr_status.attr, + &class_attr_iotest.attr, + NULL }; +ATTRIBUTE_GROUPS(aml_spi_class); + static struct class aml_spi_class = { .name = "aml_dvb_spi_test", - .class_attrs = aml_spi_class_attrs, + .class_groups = aml_spi_class_groups, }; - /**\brief aml_con_gpio_by_spi:control gpio by spi * \param gpio: the value is from AM_CON_GPIO def * \param level: 0: set low,1:set hight diff --git a/drivers/stream_input/parser/dvb_ci/aml_spi.h b/drivers/stream_input/parser/dvb_ci/aml_spi.h index 7a9493e..d33a72f 100644 --- a/drivers/stream_input/parser/dvb_ci/aml_spi.h +++ b/drivers/stream_input/parser/dvb_ci/aml_spi.h @@ -20,11 +20,11 @@ #ifndef __AML_SPI_H_ #define __AML_SPI_H_ -#include <linux/amlogic/aml_gpio_consumer.h> +//#include <linux/amlogic/aml_gpio_consumer.h> #include <linux/gpio/consumer.h> #include "aml_pcmcia.h" #include "aml_ci.h" -#include "drivers/media/dvb-core/dvb_ca_en50221.h" +#include "dvb_ca_en50221.h" /* aml spi dev diff --git a/drivers/stream_input/parser/dvb_ci/cimax/aml_cimax_usb.c b/drivers/stream_input/parser/dvb_ci/cimax/aml_cimax_usb.c index b74b34a..a45655e 100644 --- a/drivers/stream_input/parser/dvb_ci/cimax/aml_cimax_usb.c +++ b/drivers/stream_input/parser/dvb_ci/cimax/aml_cimax_usb.c @@ -24,6 +24,9 @@ #include <linux/mutex.h> #include <linux/firmware.h> #include <linux/delay.h> +#include <linux/of_gpio.h> +#include <linux/sched/clock.h> + //#include <linux/switch.h> #include "aml_cimax.h" @@ -469,8 +472,8 @@ module_param_named(usbcam_irq_mode, cam_irq_mode, int, 0644); #define REG_TIMEOUT 500 #define CAM_TIMEOUT 5000 -static int aml_cimax_usb_mod_init(void); -static void aml_cimax_usb_mod_exit(void); +static int aml_cimax_usb_mod_init(struct platform_device *pdev); +static void aml_cimax_usb_mod_exit(struct platform_device *pdev); static int cimax_usb_set_loop(struct cimax_usb *usb, int loop); @@ -1322,7 +1325,7 @@ int aml_cimax_usb_init(struct platform_device *pdev, struct aml_cimax *cimax) g_usb = cimax_usb; - aml_cimax_usb_mod_init(); + aml_cimax_usb_mod_init(pdev); cimax_usb_set_cb(cimax_usb_dev_add, cimax_usb_dev_remove); @@ -1337,7 +1340,7 @@ int aml_cimax_usb_exit(struct aml_cimax *cimax) if (!usb) return -ENODEV; - aml_cimax_usb_mod_exit(); + aml_cimax_usb_mod_exit(usb->pdev); cimax_usb_device_close(usb->dev); cimax_usb_setup_poll(usb, STOP_MODE); @@ -1679,34 +1682,50 @@ static ssize_t detect_store(struct class *class, return size; } - -static struct class_attribute cimax_usb_class_attrs[] = { - __ATTR_RW(reset), - __ATTR_RO(debug), - __ATTR_RW(addr), - __ATTR_RW(reg), - __ATTR_RW(cis), - __ATTR_RO(ts_rate), - __ATTR_RW(loop), - __ATTR_WO(slot_reset), - __ATTR_WO(detect), - __ATTR_NULL +static CLASS_ATTR_RW(reset); +static CLASS_ATTR_RO(debug); +static CLASS_ATTR_RW(addr); +static CLASS_ATTR_RW(reg); +static CLASS_ATTR_RW(cis); +static CLASS_ATTR_RO(ts_rate); +static CLASS_ATTR_RW(loop); +static CLASS_ATTR_WO(slot_reset); +static CLASS_ATTR_WO(detect); + +#define CLASS_ATTR(name) &class_attr_##name.attr + +static struct attribute *cimax_usb_class_attrs[] = { + CLASS_ATTR(reset), + CLASS_ATTR(debug), + CLASS_ATTR(addr), + CLASS_ATTR(reg), + CLASS_ATTR(cis), + CLASS_ATTR(ts_rate), + CLASS_ATTR(loop), + CLASS_ATTR(slot_reset), + CLASS_ATTR(detect), + NULL }; + +ATTRIBUTE_GROUPS(cimax_usb_class); + static struct class cimax_usb_class = { .name = "cimax_usb", - .class_attrs = cimax_usb_class_attrs, + .class_groups = cimax_usb_class_groups, }; -static int aml_cimax_usb_mod_init(void) +static int aml_cimax_usb_mod_init(struct platform_device *pdev) { int ret; pr_dbg("Amlogic CIMAX USB Init\n"); + ret = class_register(&cimax_usb_class); + return 0; } -static void aml_cimax_usb_mod_exit(void) +static void aml_cimax_usb_mod_exit(struct platform_device *pdev) { pr_dbg("Amlogic CIMAX USB Exit\n"); class_unregister(&cimax_usb_class); diff --git a/drivers/stream_input/parser/dvb_ci/cimax/dvb_ca_en50221_cimax.c b/drivers/stream_input/parser/dvb_ci/cimax/dvb_ca_en50221_cimax.c index 0f09799..eb69d72 100644 --- a/drivers/stream_input/parser/dvb_ci/cimax/dvb_ca_en50221_cimax.c +++ b/drivers/stream_input/parser/dvb_ci/cimax/dvb_ca_en50221_cimax.c @@ -27,6 +27,7 @@ #include <linux/delay.h> #include <linux/spinlock.h> #include <linux/sched.h> +#include <linux/sched/signal.h> #include <linux/kthread.h> #include "dvb_ca_en50221_cimax.h" diff --git a/drivers/stream_input/parser/dvb_ci/cimax/dvb_ringbuffer.c b/drivers/stream_input/parser/dvb_ci/cimax/dvb_ringbuffer.c index fa5c163..ffdb8fb 100644 --- a/drivers/stream_input/parser/dvb_ci/cimax/dvb_ringbuffer.c +++ b/drivers/stream_input/parser/dvb_ci/cimax/dvb_ringbuffer.c @@ -31,7 +31,7 @@ #include <linux/module.h> #include <linux/sched.h> #include <linux/string.h> -#include <asm/uaccess.h> +#include <linux/uaccess.h> #include "dvb_ringbuffer.h" @@ -70,12 +70,12 @@ ssize_t dvb_ringbuffer_free(struct dvb_ringbuffer *rbuf) { ssize_t free; - /* ACCESS_ONCE() to load read pointer on writer side + /* READ_ONCE() to load read pointer on writer side * this pairs with smp_store_release() in dvb_ringbuffer_read(), * dvb_ringbuffer_read_user(), dvb_ringbuffer_flush(), * or dvb_ringbuffer_reset() */ - free = ACCESS_ONCE(rbuf->pread) - rbuf->pwrite; + free = READ_ONCE(rbuf->pread) - rbuf->pwrite; if (free <= 0) free += rbuf->size; return free-1; diff --git a/drivers/stream_input/parser/dvb_ci/cimax/usb/SRC/cimax+usb-driver.c b/drivers/stream_input/parser/dvb_ci/cimax/usb/SRC/cimax+usb-driver.c index 43cdcde..e5e9af5 100644 --- a/drivers/stream_input/parser/dvb_ci/cimax/usb/SRC/cimax+usb-driver.c +++ b/drivers/stream_input/parser/dvb_ci/cimax/usb/SRC/cimax+usb-driver.c @@ -1495,7 +1495,7 @@ static int device_tsbulk_send(struct device_s *device, /*dbg("Transmit %d bytes\n",urb->transfer_buffer_length);*/ /*dbg_dump("txBuf", urb->transfer_buffer, urb->transfer_buffer_length);*/ - mod_timer(&(device->channel[index].StartBulkReadTimer), + mod_timer(&(gbulk_timer[index].StartBulkReadTimer), usecs_to_jiffies(50)); if (usb_submit_urb(urb, GFP_KERNEL) < 0) { @@ -1510,9 +1510,9 @@ static int device_tsbulk_send(struct device_s *device, } /* device_tsbulk_send */ /* ---------------------------------------------------------- */ -static void StartBulkRead_func(unsigned long context) +static void StartBulkRead_func(struct timer_list * timer) { - struct bulk_timer_s *bulk_time = (struct bulk_timer_s *) context; + struct bulk_timer_s *bulk_time = from_timer(bulk_time,timer,StartBulkReadTimer) ; device_start_tsbulk_in(bulk_time->device, bulk_time->index); } @@ -1552,9 +1552,8 @@ static int device_drv_open(struct device_s *device) device->channel[index].FirstTransfer = true; gbulk_timer[index].device = device; gbulk_timer[index].index = index; - setup_timer(&device->channel[index].StartBulkReadTimer, - StartBulkRead_func, - (unsigned long)&(gbulk_timer[index])); + timer_setup(&gbulk_timer[index].StartBulkReadTimer, + StartBulkRead_func,0); } #ifdef DEBUG_CONTINUITY init_tab_cc(); @@ -1821,9 +1820,11 @@ static long device_ioctl(struct file *file, /* Verify direction (read/write) */ if (_IOC_DIR(cmd) & _IOC_READ) - err = !access_ok(VERIFY_WRITE, (void *)arg, _IOC_SIZE(cmd)); +// err = !access_ok(VERIFY_WRITE, (void *)arg, _IOC_SIZE(cmd)); + err = !access_ok((void *)arg, _IOC_SIZE(cmd)); else if (_IOC_DIR(cmd) & _IOC_WRITE) - err = !access_ok(VERIFY_READ, (void *)arg, _IOC_SIZE(cmd)); +// err = !access_ok(VERIFY_READ, (void *)arg, _IOC_SIZE(cmd)); + err = !access_ok((void *)arg, _IOC_SIZE(cmd)); if (err) return -EFAULT; diff --git a/drivers/stream_input/parser/dvb_ci/cimax/usb/SRC/cimax+usb-driver.h b/drivers/stream_input/parser/dvb_ci/cimax/usb/SRC/cimax+usb-driver.h index e4656e0..774c50a 100644 --- a/drivers/stream_input/parser/dvb_ci/cimax/usb/SRC/cimax+usb-driver.h +++ b/drivers/stream_input/parser/dvb_ci/cimax/usb/SRC/cimax+usb-driver.h @@ -298,6 +298,7 @@ struct ci_bulk_s { /** * @brief * TS channel (can use isoc or bulk interface). + * x */ struct ts_channel_s { spinlock_t inLock; @@ -320,7 +321,6 @@ struct ts_channel_s { int nbByteSend; int nbByteRead; __u8 FirstTransfer; - struct timer_list StartBulkReadTimer; #ifdef DEBUG_BITRATE ktime_t bitrateTime @@ -344,6 +344,7 @@ struct device_s { struct bulk_timer_s { struct device_s *device; __u8 index; + struct timer_list StartBulkReadTimer; }; int cimax_usb_select_interface(struct device_s *device, unsigned long intf); diff --git a/drivers/stream_input/parser/dvb_ci/cimcu/dvb_ca_en50221_cimcu.c b/drivers/stream_input/parser/dvb_ci/cimcu/dvb_ca_en50221_cimcu.c index 762f5ff..dc06f30 100644 --- a/drivers/stream_input/parser/dvb_ci/cimcu/dvb_ca_en50221_cimcu.c +++ b/drivers/stream_input/parser/dvb_ci/cimcu/dvb_ca_en50221_cimcu.c @@ -37,6 +37,7 @@ #include <linux/spinlock.h> #include <linux/sched.h> #include <linux/kthread.h> +#include <linux/sched/signal.h> #include "dvb_ca_en50221_cimcu.h" #include "../cimax/dvb_ringbuffer.h" diff --git a/drivers/stream_input/parser/dvb_common.h b/drivers/stream_input/parser/dvb_common.h index 85a21d5..f36097c 100644 --- a/drivers/stream_input/parser/dvb_common.h +++ b/drivers/stream_input/parser/dvb_common.h @@ -22,6 +22,49 @@ #include "dvb_frontend.h" +typedef enum dmx_source { + DMX_SOURCE_FRONT0 = 0, + DMX_SOURCE_FRONT1, + DMX_SOURCE_FRONT2, + DMX_SOURCE_FRONT3, + DMX_SOURCE_DVR0 = 16, + DMX_SOURCE_DVR1, + DMX_SOURCE_DVR2, + DMX_SOURCE_DVR3, + +#ifdef CONFIG_AMLOGIC_DVB_COMPAT + DMX_SOURCE_FRONT0_OFFSET = 100, + DMX_SOURCE_FRONT1_OFFSET, + DMX_SOURCE_FRONT2_OFFSET +#endif +} dmx_source_t; + +enum aml_dmx_id_t { + AM_DMX_0 = 0, + AM_DMX_1, + AM_DMX_2, + AM_DMX_MAX, +}; + +enum aml_ts_source_t { + AM_TS_SRC_TS0, + AM_TS_SRC_TS1, + AM_TS_SRC_TS2, + AM_TS_SRC_TS3, + + AM_TS_SRC_S_TS0, + AM_TS_SRC_S_TS1, + AM_TS_SRC_S_TS2, + AM_TS_SRC_S_TS3, + + AM_TS_SRC_HIU, + AM_TS_SRC_HIU1, + AM_TS_SRC_DMX0, + AM_TS_SRC_DMX1, + AM_TS_SRC_DMX2 +}; + + extern int dvb_attach_tuner(struct dvb_frontend *fe, struct aml_tuner *tuner, enum tuner_type *type); extern int dvb_detach_tuner(enum tuner_type *type); @@ -114,6 +157,12 @@ static inline struct dvb_frontend *cxd2856_attach( { return NULL; } + +static inline struct dvb_frontend *aml_dtvdm_attach( + const struct demod_config *cfg) +{ + return NULL; +} /* For attach demod driver end */ #endif /* __DVB_COMMON_H__ */ diff --git a/drivers/stream_input/parser/hw_demux/Makefile b/drivers/stream_input/parser/hw_demux/Makefile index e031594..93454ae 100644 --- a/drivers/stream_input/parser/hw_demux/Makefile +++ b/drivers/stream_input/parser/hw_demux/Makefile @@ -1,6 +1,6 @@ obj-m += aml_hardware_dmx.o -ccflags-y += -I$(srctree)/drivers/media/dvb-core -I$(srctree)/drivers/gpio -I$(srctree)/include -DENABLE_DEMUX_DRIVER +ccflags-y += -I$(srctree)/include/media -I$(srctree)/drivers/media/pci/ttpci -I$(srctree)/drivers/gpio -I$(srctree)/include -DENABLE_DEMUX_DRIVER aml_hardware_dmx-objs += aml_dvb.o aml_hardware_dmx-objs += aml_dmx.o diff --git a/drivers/stream_input/parser/hw_demux/aml_dmx.c b/drivers/stream_input/parser/hw_demux/aml_dmx.c index 6809e4c..ef01f55 100644 --- a/drivers/stream_input/parser/hw_demux/aml_dmx.c +++ b/drivers/stream_input/parser/hw_demux/aml_dmx.c @@ -49,6 +49,7 @@ #include "c_stb_regs_define.h" #include "aml_dvb.h" #include "aml_dvb_reg.h" +#include <linux/sched/signal.h> #define ENABLE_SEC_BUFF_WATCHDOG @@ -175,6 +176,8 @@ static u32 old_stb_top_config; static u32 old_fec_input_control; static int have_old_stb_top_config = 1; static int have_old_fec_input_control = 1; +static int s_key_endia = 0; +static int s_add_s2p2 = 0; static void dmx_write_reg(int r, u32 v) @@ -465,9 +468,9 @@ static int asyncfifo_buf_len = ASYNCFIFO_BUFFER_SIZE_DEFAULT; /*Section buffer watchdog*/ -static void section_buffer_watchdog_func(unsigned long arg) +static void section_buffer_watchdog_func(struct timer_list * timer) { - struct aml_dvb *dvb = (struct aml_dvb *)arg; + struct aml_dvb *dvb = from_timer(dvb,timer,watchdog_timer); struct aml_dmx *dmx; u32 section_busy32 = 0, om_cmd_status32 = 0, demux_channel_activity32 = 0; @@ -720,7 +723,7 @@ static void section_notify(struct aml_dmx *dmx, struct aml_filter *f, u8 *p) struct dvb_demux_feed *feed = dmx->channel[f->chan_id].feed; if (feed && feed->cb.sec) - feed->cb.sec(p, sec_len, NULL, 0, f->filter); + feed->cb.sec(p, sec_len, NULL, 0, f->filter,0); } static void hardware_match_section(struct aml_dmx *dmx, @@ -1174,7 +1177,7 @@ static void process_sub(struct aml_dmx *dmx) { dmx->channel[2].feed->cb.ts(buffer1_virt, len1, buffer2_virt, len2, - &dmx->channel[2].feed->feed.ts); + &dmx->channel[2].feed->feed.ts,0); } } WRITE_MPEG_REG(PARSER_SUB_RP, rd_ptr); @@ -1235,7 +1238,7 @@ static void process_pes(struct aml_dmx *dmx) if (ch->feed->ts_type & TS_PAYLOAD_ONLY) { ch->feed->cb.ts(buffer1, len1, buffer2, len2, - &ch->feed->feed.ts); + &ch->feed->feed.ts,0); } } } @@ -1426,7 +1429,7 @@ static void dvr_process_channel(struct aml_asyncfifo *afifo, channel->dvr_feed->cb.ts( (u8 *)afifo->pages+afifo->buf_read*size, cnt*size, NULL, 0, - &channel->dvr_feed->feed.ts); + &channel->dvr_feed->feed.ts,0); } else { blk.addr = afifo->blk.addr+afifo->buf_read*size; blk.len = cnt*size; @@ -1439,7 +1442,7 @@ static void dvr_process_channel(struct aml_asyncfifo *afifo, (u8 *)&blk, sizeof(struct aml_dvr_block), NULL, 0, - &channel->dvr_feed->feed.ts); + &channel->dvr_feed->feed.ts,0); } } afifo->buf_read = 0; @@ -1461,7 +1464,7 @@ static void dvr_process_channel(struct aml_asyncfifo *afifo, channel->dvr_feed->cb.ts( (u8 *)afifo->pages+afifo->buf_read*size, cnt*size, NULL, 0, - &channel->dvr_feed->feed.ts); + &channel->dvr_feed->feed.ts,0); } } else { blk.addr = afifo->blk.addr+afifo->buf_read*size; @@ -1475,7 +1478,7 @@ static void dvr_process_channel(struct aml_asyncfifo *afifo, (u8 *)&blk, sizeof(struct aml_dvr_block), NULL, 0, - &channel->dvr_feed->feed.ts); + &channel->dvr_feed->feed.ts,0); } } afifo->buf_read = afifo->buf_toggle; @@ -1545,7 +1548,10 @@ static irqreturn_t dvr_irq_handler(int irq_number, void *para) tasklet_schedule(&afifo->asyncfifo_tasklet); return IRQ_HANDLED; } - +int aml_s2p_add(int num) { + s_add_s2p2 = num; + return 0; +} /*Enable the STB*/ static void stb_enable(struct aml_dvb *dvb) { @@ -1713,7 +1719,7 @@ static void stb_enable(struct aml_dvb *dvb) (ciplus)); ciplus = 0; - if (get_cpu_type() >= MESON_CPU_MAJOR_ID_TL1) { + if (s_add_s2p2) { invert2 = dvb->s2p[2].invert; WRITE_MPEG_REG(STB_S2P2_CONFIG, @@ -1725,7 +1731,7 @@ static void stb_enable(struct aml_dvb *dvb) hiu = 0; /* invert ts out clk,add ci model need add this*/ if (dvb->ts_out_invert) { - printk("ts out invert ---\r\n"); + /*printk("ts out invert ---\r\n");*/ data = READ_MPEG_REG(TS_TOP_CONFIG); data |= 1 << TS_OUT_CLK_INVERT; WRITE_MPEG_REG(TS_TOP_CONFIG, data); @@ -2079,7 +2085,7 @@ static void aml_ci_plus_config(int key_endian, int mode, int algo) pr_dbg("%s mode:%d,alog:%d\n",__FUNCTION__,mode,algo); - if (get_cpu_type() < MESON_CPU_MAJOR_ID_SM1) { + if (s_key_endia == 0) { WRITE_MPEG_REG(CIPLUS_ENDIAN, (15 << AES_MSG_OUT_ENDIAN) | (15 << AES_MSG_IN_ENDIAN) @@ -2246,7 +2252,7 @@ static int dsc_set_aes_des_sm4_key(struct aml_dsc_channel *ch, int flags, int algo = 0; if (!from_kl) { - if (get_cpu_type() < MESON_CPU_MAJOR_ID_SM1) { + if (s_key_endia == 0) { k3 = (key[0] << 24) | (key[1] << 16) | (key[2] << 8) | key[3]; k2 = (key[4] << 24) | (key[5] << 16) | (key[6] << 8) | key[7]; k1 = (key[8] << 24) | (key[9] << 16) | (key[10] << 8) | key[11]; @@ -2383,7 +2389,10 @@ int dsc_enable(struct aml_dsc *dsc, int enable) } return 0; } - +int dsc_set_key_endia(int key_endia) { + s_key_endia = key_endia; + return 0; +} /*Set section buffer*/ static int dmx_alloc_sec_buffer(struct aml_dmx *dmx) { @@ -2821,13 +2830,9 @@ static int dmx_init(struct aml_dmx *dmx) /*Reset the hardware */ if (!dvb->dmx_init) { - init_timer(&dvb->watchdog_timer); - dvb->watchdog_timer.function = section_buffer_watchdog_func; - dvb->watchdog_timer.expires = - jiffies + msecs_to_jiffies(WATCHDOG_TIMER); - dvb->watchdog_timer.data = (unsigned long)dvb; + timer_setup(&dvb->watchdog_timer, section_buffer_watchdog_func,0); #ifdef ENABLE_SEC_BUFF_WATCHDOG - add_timer(&dvb->watchdog_timer); + mod_timer(&dvb->watchdog_timer,jiffies + msecs_to_jiffies(WATCHDOG_TIMER)); #endif dmx_reset_hw(dvb); } @@ -3154,7 +3159,7 @@ static int dmx_enable(struct aml_dmx *dmx) (invert1 << INVERT_S2P1_FEC_CLK); WRITE_MPEG_REG(STB_TOP_CONFIG, v); - if (get_cpu_type() >= MESON_CPU_MAJOR_ID_TL1) { + if (s_add_s2p2) { invert2 = dvb->s2p[2].invert; //add s2p2 config @@ -5455,7 +5460,7 @@ int _set_tsfile_clkdiv(struct aml_dvb *dvb, int clkdiv) return 0; } -static ssize_t stb_set_tsfile_clkdiv(struct class *class, +static ssize_t tsfile_clkdiv_store(struct class *class, struct class_attribute *attr, const char *buf, size_t size) { @@ -5467,7 +5472,7 @@ static ssize_t stb_set_tsfile_clkdiv(struct class *class, return size; } -static ssize_t stb_get_tsfile_clkdiv(struct class *class, +static ssize_t tsfile_clkdiv_show(struct class *class, struct class_attribute *attr, char *buf) { ssize_t ret; @@ -5537,7 +5542,7 @@ static ssize_t dmx_timeout_store(struct class *class, #define DEMUX_SCAMBLE_FUNC_DECL(i) \ -static ssize_t dmx_reg_value_show_demux##i##_scramble(struct class *class, \ +static ssize_t demux##i##_scramble_show(struct class *class, \ struct class_attribute *attr, char *buf)\ {\ int data = 0;\ @@ -5634,21 +5639,21 @@ static ssize_t reset_fec_input_ctrl_store(struct class *class, return size; } -static ssize_t dmx_reg_addr_show_source(struct class *class, +static ssize_t register_addr_show(struct class *class, struct class_attribute *attr, char *buf); -static ssize_t dmx_reg_addr_store_source(struct class *class, +static ssize_t register_addr_store(struct class *class, struct class_attribute *attr, const char *buf, size_t size); -static ssize_t dmx_id_show_source(struct class *class, +static ssize_t dmx_id_show(struct class *class, struct class_attribute *attr, char *buf); -static ssize_t dmx_id_store_source(struct class *class, +static ssize_t dmx_id_store(struct class *class, struct class_attribute *attr, const char *buf, size_t size); -static ssize_t dmx_reg_value_show_source(struct class *class, +static ssize_t register_value_show(struct class *class, struct class_attribute *attr, char *buf); -static ssize_t dmx_reg_value_store_source(struct class *class, +static ssize_t register_value_store(struct class *class, struct class_attribute *attr, const char *buf, size_t size); static ssize_t dmx_sec_statistics_show(struct class *class, @@ -5656,51 +5661,63 @@ static ssize_t dmx_sec_statistics_show(struct class *class, char *buf); static int reg_addr; -static struct class_attribute aml_dmx_class_attrs[] = { - __ATTR(dmx_id, 0644, dmx_id_show_source, - dmx_id_store_source), - __ATTR(register_addr, 0644, dmx_reg_addr_show_source, - dmx_reg_addr_store_source), - __ATTR(register_value, 0644, dmx_reg_value_show_source, - dmx_reg_value_store_source), - __ATTR(tsfile_clkdiv, 0644, stb_get_tsfile_clkdiv, - stb_set_tsfile_clkdiv), +static CLASS_ATTR_RW(dmx_id); +static CLASS_ATTR_RW(register_addr); +static CLASS_ATTR_RW(register_value); +static CLASS_ATTR_RW(tsfile_clkdiv); #define DEMUX_SCAMBLE_ATTR_DECL(i)\ - __ATTR(demux##i##_scramble, 0644, \ - dmx_reg_value_show_demux##i##_scramble, NULL) + CLASS_ATTR_RO(demux##i##_scramble); #if DMX_DEV_COUNT > 0 - DEMUX_SCAMBLE_ATTR_DECL(0), +DEMUX_SCAMBLE_ATTR_DECL(0); #endif #if DMX_DEV_COUNT > 1 - DEMUX_SCAMBLE_ATTR_DECL(1), +DEMUX_SCAMBLE_ATTR_DECL(1); #endif #if DMX_DEV_COUNT > 2 - DEMUX_SCAMBLE_ATTR_DECL(2), +DEMUX_SCAMBLE_ATTR_DECL(2); #endif - __ATTR(dmx_smallsec, 0644, - dmx_smallsec_show, - dmx_smallsec_store), - __ATTR(dmx_timeout, 0644, - dmx_timeout_show, - dmx_timeout_store), - __ATTR(reset_fec_input_ctrl, 0644, - reset_fec_input_ctrl_show, - reset_fec_input_ctrl_store), - __ATTR(ciplus_output_ctrl, 0644, - ciplus_output_ctrl_show, - ciplus_output_ctrl_store), - __ATTR_RO(dmx_sec_statistics), - __ATTR_NULL +static CLASS_ATTR_RW(dmx_smallsec); +static CLASS_ATTR_RW(dmx_timeout); +static CLASS_ATTR_RW(reset_fec_input_ctrl); +static CLASS_ATTR_RW(ciplus_output_ctrl); +static CLASS_ATTR_RO(dmx_sec_statistics); + +#define DMX_ATTR(name) &class_attr_##name.attr + +static struct attribute *aml_dmx_class_attrs[] = { + DMX_ATTR(dmx_id), + DMX_ATTR(register_addr), + DMX_ATTR(register_value), + DMX_ATTR(tsfile_clkdiv), + DMX_ATTR(dmx_smallsec), + DMX_ATTR(dmx_timeout), + DMX_ATTR(reset_fec_input_ctrl), + DMX_ATTR(ciplus_output_ctrl), + DMX_ATTR(dmx_sec_statistics), +#define DEMUX_SCRAMBLE(i) \ + DMX_ATTR(demux##i##_scramble) +#if DMX_DEV_COUNT > 0 + DEMUX_SCRAMBLE(0), +#endif +#if DMX_DEV_COUNT > 1 + DEMUX_SCRAMBLE(1), +#endif +#if DMX_DEV_COUNT > 2 + DEMUX_SCRAMBLE(2), +#endif + NULL, }; +ATTRIBUTE_GROUPS(aml_dmx_class); + static struct class aml_dmx_class = { .name = "dmx", - .class_attrs = aml_dmx_class_attrs, + .class_groups = aml_dmx_class_groups, }; -static ssize_t dmx_id_show_source(struct class *class, +static ssize_t dmx_id_show(struct class *class, struct class_attribute *attr, char *buf) { int ret; @@ -5709,7 +5726,7 @@ static ssize_t dmx_id_show_source(struct class *class, return ret; } -static ssize_t dmx_id_store_source(struct class *class, +static ssize_t dmx_id_store(struct class *class, struct class_attribute *attr, const char *buf, size_t size) { @@ -5728,7 +5745,7 @@ static ssize_t dmx_id_store_source(struct class *class, return size; } -static ssize_t dmx_reg_addr_show_source(struct class *class, +static ssize_t register_addr_show(struct class *class, struct class_attribute *attr, char *buf) { @@ -5738,7 +5755,7 @@ static ssize_t dmx_reg_addr_show_source(struct class *class, return ret; } -static ssize_t dmx_reg_addr_store_source(struct class *class, +static ssize_t register_addr_store(struct class *class, struct class_attribute *attr, const char *buf, size_t size) { @@ -5752,7 +5769,7 @@ static ssize_t dmx_reg_addr_store_source(struct class *class, return size; } -static ssize_t dmx_reg_value_show_source(struct class *class, +static ssize_t register_value_show(struct class *class, struct class_attribute *attr, char *buf) { @@ -5763,7 +5780,7 @@ static ssize_t dmx_reg_value_show_source(struct class *class, return ret; } -static ssize_t dmx_reg_value_store_source(struct class *class, +static ssize_t register_value_store(struct class *class, struct class_attribute *attr, const char *buf, size_t size) { @@ -5802,7 +5819,6 @@ static ssize_t dmx_sec_statistics_show(struct class *class, int aml_regist_dmx_class(void) { - if (class_register(&aml_dmx_class) < 0) pr_error("register class error\n"); @@ -5811,7 +5827,6 @@ int aml_regist_dmx_class(void) int aml_unregist_dmx_class(void) { - class_unregister(&aml_dmx_class); return 0; } diff --git a/drivers/stream_input/parser/hw_demux/aml_dvb.c b/drivers/stream_input/parser/hw_demux/aml_dvb.c index 2c8c09a..157bdf4 100644 --- a/drivers/stream_input/parser/hw_demux/aml_dvb.c +++ b/drivers/stream_input/parser/hw_demux/aml_dvb.c @@ -50,6 +50,7 @@ #include <linux/amlogic/media/utils/amstream.h> #include <linux/amlogic/cpu_version.h> #include <linux/clk.h> +#include <linux/of_irq.h> #include "c_stb_define.h" #include "c_stb_regs_define.h" #include "aml_dvb.h" @@ -171,8 +172,7 @@ static void aml_dvb_dmx_release(struct aml_dvb *advb, struct aml_dmx *dmx) static int aml_dvb_dmx_init(struct aml_dvb *advb, struct aml_dmx *dmx, int id) { int i, ret; - - struct resource *res; + struct device_node *node_dmx = NULL; char buf[32]; switch (id) { @@ -186,13 +186,19 @@ static int aml_dvb_dmx_init(struct aml_dvb *advb, struct aml_dmx *dmx, int id) dmx->dmx_irq = INT_DEMUX_2; break; } - - snprintf(buf, sizeof(buf), "demux%d_irq", id); - res = platform_get_resource_byname(advb->pdev, IORESOURCE_IRQ, buf); - if (res) - dmx->dmx_irq = res->start; - - printk("%s irq num:%d \r\n", buf, dmx->dmx_irq); + memset(buf, 0, 32); + snprintf(buf, sizeof(buf), "dmx"); + node_dmx = of_parse_phandle(advb->pdev->dev.of_node, buf, 0); + if (node_dmx) { + memset(buf, 0, sizeof(buf)); + snprintf(buf, sizeof(buf), "demux%d_irq", id); + ret = of_irq_get_byname(node_dmx, buf); + if (ret > 0) + dmx->dmx_irq = ret; + printk("get irq num demux%d_irq:%d\n",id,dmx->dmx_irq); + } else { + printk("get default demux%d_irq:%d\n",id,dmx->dmx_irq); + } dmx->source = -1; dmx->dump_ts_select = 0; @@ -478,7 +484,7 @@ static int dvb_dsc_do_ioctl(struct file *file, unsigned int cmd, dsc_reset(dsc); break; case CA_GET_CAP: { - ca_caps_t *cap = parg; + struct ca_caps *cap = parg; cap->slot_num = 1; cap->slot_type = CA_DESCR; @@ -487,7 +493,7 @@ static int dvb_dsc_do_ioctl(struct file *file, unsigned int cmd, break; } case CA_GET_SLOT_INFO: { - ca_slot_info_t *slot = parg; + struct ca_slot_info *slot = parg; slot->num = 1; slot->type = CA_DESCR; @@ -495,14 +501,14 @@ static int dvb_dsc_do_ioctl(struct file *file, unsigned int cmd, break; } case CA_GET_DESCR_INFO: { - ca_descr_info_t *descr = parg; + struct ca_descr_info *descr = parg; descr->num = DSC_COUNT; descr->type = 0; break; } case CA_SET_DESCR: { - ca_descr_t *d = parg; + struct ca_descr *d = parg; struct ca_descr_ex dex; dex.index = d->index; @@ -515,7 +521,7 @@ static int dvb_dsc_do_ioctl(struct file *file, unsigned int cmd, break; } case CA_SET_PID: { - ca_pid_t *pi = parg; + struct ca_pid *pi = parg; int i; if (pi->index == -1) { @@ -681,8 +687,9 @@ static struct dvb_device dvbdev_dsc = { static int aml_dvb_asyncfifo_init(struct aml_dvb *advb, struct aml_asyncfifo *asyncfifo, int id) { - struct resource *res; char buf[32]; + int ret = 0; + struct device_node *node_dmx = NULL; if (id == 0) asyncfifo->asyncfifo_irq = INT_ASYNC_FIFO_FLUSH; @@ -691,11 +698,19 @@ static int aml_dvb_asyncfifo_init(struct aml_dvb *advb, else asyncfifo->asyncfifo_irq = INT_ASYNC_FIFO2_FLUSH; - snprintf(buf, sizeof(buf), "dvr%d_irq", id); - res = platform_get_resource_byname(advb->pdev, IORESOURCE_IRQ, buf); - if (res) - asyncfifo->asyncfifo_irq = res->start; - pr_inf("%s irq num:%d \n", buf, asyncfifo->asyncfifo_irq); + memset(buf, 0, 32); + snprintf(buf, sizeof(buf), "dmx"); + node_dmx = of_parse_phandle(advb->pdev->dev.of_node, buf, 0); + if (node_dmx) { + memset(buf, 0, sizeof(buf)); + snprintf(buf, sizeof(buf), "dvr%d_irq", id); + ret = of_irq_get_byname(node_dmx, buf); + if (ret > 0) + asyncfifo->asyncfifo_irq = ret; + printk("get async%d_irq:%d\n",id,asyncfifo->asyncfifo_irq); + } else { + printk("get default async%d_irq:%d\n",id,asyncfifo->asyncfifo_irq); + } asyncfifo->dvb = advb; asyncfifo->id = id; asyncfifo->init = 0; @@ -743,7 +758,7 @@ static void aml_dvb_dsc_release(struct aml_dvb *advb, /*Show the STB input source*/ -static ssize_t stb_show_source(struct class *class, +static ssize_t source_show(struct class *class, struct class_attribute *attr, char *buf) { struct aml_dvb *dvb = &aml_dvb_device; @@ -790,7 +805,7 @@ static ssize_t stb_show_source(struct class *class, return ret; } -static ssize_t stb_clear_av(struct class *class, +static ssize_t clear_av_store(struct class *class, struct class_attribute *attr, const char *buf, size_t size) { @@ -805,7 +820,7 @@ static ssize_t stb_clear_av(struct class *class, } /*Set the STB input source*/ -static ssize_t stb_store_source(struct class *class, +static ssize_t source_store(struct class *class, struct class_attribute *attr, const char *buf, size_t size) { @@ -835,7 +850,7 @@ static ssize_t stb_store_source(struct class *class, return size; } -static ssize_t show_dmx_reset_all_flag(struct class *class, +static ssize_t demux_reset_all_flag_show(struct class *class, struct class_attribute *attr, char *buf) { ssize_t ret = 0; @@ -848,7 +863,7 @@ static ssize_t show_dmx_reset_all_flag(struct class *class, ret = sprintf(buf, "%s\n", src); return ret; } -static ssize_t set_dmx_reset_all_flag(struct class *class, +static ssize_t demux_reset_all_flag_store(struct class *class, struct class_attribute *attr, const char *buf, size_t size) { @@ -863,7 +878,7 @@ static ssize_t set_dmx_reset_all_flag(struct class *class, /*Show the descrambler's input source*/ #define DSC_SOURCE_FUNC_DECL(i) \ -static ssize_t dsc##i##_show_source(struct class *class, \ +static ssize_t dsc##i##_source_show(struct class *class, \ struct class_attribute *attr, char *buf)\ {\ struct aml_dvb *dvb = &aml_dvb_device;\ @@ -901,7 +916,7 @@ static ssize_t dsc##i##_show_source(struct class *class, \ ret = sprintf(buf, "%s-%s\n", src, dst);\ return ret;\ } \ -static ssize_t dsc##i##_store_source(struct class *class, \ +static ssize_t dsc##i##_source_store(struct class *class, \ struct class_attribute *attr, const char *buf, size_t size)\ {\ dmx_source_t src = -1, dst = -1;\ @@ -930,7 +945,7 @@ static ssize_t dsc##i##_store_source(struct class *class, \ /*Show free descramblers count*/ #define DSC_FREE_FUNC_DECL(i) \ -static ssize_t dsc##i##_show_free_dscs(struct class *class, \ +static ssize_t dsc##i##_free_dscs_show(struct class *class, \ struct class_attribute *attr, char *buf) \ { \ struct aml_dvb *dvb = &aml_dvb_device; \ @@ -960,7 +975,7 @@ static ssize_t dsc##i##_show_free_dscs(struct class *class, \ #endif /*Show the TS output source*/ -static ssize_t tso_show_source(struct class *class, +static ssize_t tso_source_show(struct class *class, struct class_attribute *attr, char *buf) { struct aml_dvb *dvb = &aml_dvb_device; @@ -1005,7 +1020,7 @@ static ssize_t tso_show_source(struct class *class, } /*Set the TS output source*/ -static ssize_t tso_store_source(struct class *class, +static ssize_t tso_source_store(struct class *class, struct class_attribute *attr, const char *buf, size_t size) { @@ -1035,7 +1050,7 @@ static ssize_t tso_store_source(struct class *class, /*Show PCR*/ #define DEMUX_PCR_FUNC_DECL(i) \ -static ssize_t demux##i##_show_pcr(struct class *class, \ +static ssize_t demux##i##_pcr_show(struct class *class, \ struct class_attribute *attr, char *buf)\ {\ int f = 0;\ @@ -1050,7 +1065,7 @@ static ssize_t demux##i##_show_pcr(struct class *class, \ /*Show the STB input source*/ #define DEMUX_SOURCE_FUNC_DECL(i) \ -static ssize_t demux##i##_show_source(struct class *class, \ +static ssize_t demux##i##_source_show(struct class *class, \ struct class_attribute *attr, char *buf)\ {\ struct aml_dvb *dvb = &aml_dvb_device;\ @@ -1095,7 +1110,7 @@ static ssize_t demux##i##_show_source(struct class *class, \ ret = sprintf(buf, "%s\n", src);\ return ret;\ } \ -static ssize_t demux##i##_store_source(struct class *class, \ +static ssize_t demux##i##_source_store(struct class *class, \ struct class_attribute *attr, const char *buf, size_t size)\ {\ dmx_source_t src = -1;\ @@ -1127,7 +1142,7 @@ static ssize_t demux##i##_store_source(struct class *class, \ /*Show free filters count*/ #define DEMUX_FREE_FILTERS_FUNC_DECL(i) \ -static ssize_t demux##i##_show_free_filters(struct class *class, \ +static ssize_t demux##i##_free_filters_show(struct class *class, \ struct class_attribute *attr, char *buf)\ {\ struct aml_dvb *dvb = &aml_dvb_device;\ @@ -1148,7 +1163,7 @@ static ssize_t demux##i##_show_free_filters(struct class *class, \ /*Show filter users count*/ #define DEMUX_FILTER_USERS_FUNC_DECL(i) \ -static ssize_t demux##i##_show_filter_users(struct class *class, \ +static ssize_t demux##i##_filter_users_show(struct class *class, \ struct class_attribute *attr, char *buf)\ {\ struct aml_dvb *dvb = &aml_dvb_device;\ @@ -1172,7 +1187,7 @@ static ssize_t demux##i##_show_filter_users(struct class *class, \ ret = sprintf(buf, "%d\n", count);\ return ret;\ } \ -static ssize_t demux##i##_store_filter_used(struct class *class, \ +static ssize_t demux##i##_filter_users_store(struct class *class, \ struct class_attribute *attr, const char *buf, size_t size)\ {\ struct aml_dvb *dvb = &aml_dvb_device;\ @@ -1195,7 +1210,7 @@ static ssize_t demux##i##_store_filter_used(struct class *class, \ /*Show ts header*/ #define DEMUX_TS_HEADER_FUNC_DECL(i) \ -static ssize_t demux##i##_show_ts_header(struct class *class, \ +static ssize_t demux##i##_ts_header_show(struct class *class, \ struct class_attribute *attr, char *buf)\ {\ int hdr = 0;\ @@ -1210,7 +1225,7 @@ static ssize_t demux##i##_show_ts_header(struct class *class, \ /*Show channel activity*/ #define DEMUX_CHANNEL_ACTIVITY_FUNC_DECL(i) \ -static ssize_t demux##i##_show_channel_activity(struct class *class, \ +static ssize_t demux##i##_channel_activity_show(struct class *class, \ struct class_attribute *attr, char *buf)\ {\ int f = 0;\ @@ -1238,7 +1253,7 @@ static ssize_t demux##i##_reset_store(struct class *class, \ /*DVR record mode*/ #define DVR_MODE_FUNC_DECL(i) \ -static ssize_t dvr##i##_show_mode(struct class *class, \ +static ssize_t dvr##i##_mode_show(struct class *class, \ struct class_attribute *attr, char *buf)\ {\ struct aml_dvb *dvb = &aml_dvb_device;\ @@ -1253,7 +1268,7 @@ static ssize_t dvr##i##_show_mode(struct class *class, \ ret = sprintf(buf, "%s\n", mode);\ return ret;\ } \ -static ssize_t dvr##i##_store_mode(struct class *class, \ +static ssize_t dvr##i##_mode_store(struct class *class, \ struct class_attribute *attr, const char *buf, size_t size)\ {\ struct aml_dvb *dvb = &aml_dvb_device;\ @@ -1305,7 +1320,7 @@ static ssize_t dvr##i##_store_mode(struct class *class, \ /*Show the async fifo source*/ #define ASYNCFIFO_SOURCE_FUNC_DECL(i) \ -static ssize_t asyncfifo##i##_show_source(struct class *class, \ +static ssize_t asyncfifo##i##_source_show(struct class *class, \ struct class_attribute *attr, char *buf)\ {\ struct aml_dvb *dvb = &aml_dvb_device;\ @@ -1331,7 +1346,7 @@ static ssize_t asyncfifo##i##_show_source(struct class *class, \ ret = sprintf(buf, "%s\n", src);\ return ret;\ } \ -static ssize_t asyncfifo##i##_store_source(struct class *class, \ +static ssize_t asyncfifo##i##_source_store(struct class *class, \ struct class_attribute *attr, const char *buf, size_t size)\ {\ enum aml_dmx_id_t src = -1;\ @@ -1364,7 +1379,7 @@ ASYNCFIFO_SOURCE_FUNC_DECL(0) /*Show the async fifo flush size*/ #define ASYNCFIFO_FLUSHSIZE_FUNC_DECL(i) \ -static ssize_t asyncfifo##i##_show_flush_size(struct class *class, \ +static ssize_t asyncfifo##i##_flush_size_show(struct class *class, \ struct class_attribute *attr, char *buf)\ {\ struct aml_dvb *dvb = &aml_dvb_device;\ @@ -1375,7 +1390,7 @@ static ssize_t asyncfifo##i##_show_flush_size(struct class *class, \ ret = sprintf(buf, "%d\n", afifo->flush_size);\ return ret;\ } \ -static ssize_t asyncfifo##i##_store_flush_size(struct class *class, \ +static ssize_t asyncfifo##i##_flush_size_store(struct class *class, \ struct class_attribute *attr, \ const char *buf, size_t size)\ {\ @@ -1411,7 +1426,7 @@ ASYNCFIFO_FLUSHSIZE_FUNC_DECL(0) /*Show the async fifo secure buffer addr*/ #define ASYNCFIFO_SECUREADDR_FUNC_DECL(i) \ -static ssize_t asyncfifo##i##_show_secure_addr(struct class *class, \ +static ssize_t asyncfifo##i##_secure_addr_show(struct class *class, \ struct class_attribute *attr, char *buf)\ {\ struct aml_dvb *dvb = &aml_dvb_device;\ @@ -1422,7 +1437,7 @@ static ssize_t asyncfifo##i##_show_secure_addr(struct class *class, \ ret = sprintf(buf, "0x%x\n", afifo->blk.addr);\ return ret;\ } \ -static ssize_t asyncfifo##i##_store_secure_addr(struct class *class, \ +static ssize_t asyncfifo##i##_secure_addr_store(struct class *class, \ struct class_attribute *attr, \ const char *buf, size_t size)\ {\ @@ -1455,7 +1470,7 @@ const char *buf, size_t size)\ /*Show the async fifo secure enable*/ #define ASYNCFIFO_SECURENABLE_FUNC_DECL(i) \ -static ssize_t asyncfifo##i##_show_secure_enable(struct class *class, \ +static ssize_t asyncfifo##i##_secure_enable_show(struct class *class, \ struct class_attribute *attr, char *buf)\ {\ struct aml_dvb *dvb = &aml_dvb_device;\ @@ -1466,7 +1481,7 @@ static ssize_t asyncfifo##i##_show_secure_enable(struct class *class, \ ret = sprintf(buf, "%d\n", afifo->secure_enable);\ return ret;\ } \ -static ssize_t asyncfifo##i##_store_secure_enable(struct class *class, \ +static ssize_t asyncfifo##i##_secure_enable_store(struct class *class, \ struct class_attribute *attr, \ const char *buf, size_t size)\ {\ @@ -1500,7 +1515,7 @@ ASYNCFIFO_SECURENABLE_FUNC_DECL(0) #endif /*Reset the Demux*/ -static ssize_t demux_do_reset(struct class *class, +static ssize_t demux_reset_store(struct class *class, struct class_attribute *attr, const char *buf, size_t size) { @@ -1518,7 +1533,7 @@ static ssize_t demux_do_reset(struct class *class, } /*Show the Video PTS value*/ -static ssize_t demux_show_video_pts(struct class *class, +static ssize_t video_pts_show(struct class *class, struct class_attribute *attr, char *buf) { struct aml_dvb *dvb = &aml_dvb_device; @@ -1530,7 +1545,7 @@ static ssize_t demux_show_video_pts(struct class *class, } /*Show the Audio PTS value*/ -static ssize_t demux_show_audio_pts(struct class *class, +static ssize_t audio_pts_show(struct class *class, struct class_attribute *attr, char *buf) { struct aml_dvb *dvb = &aml_dvb_device; @@ -1542,7 +1557,7 @@ static ssize_t demux_show_audio_pts(struct class *class, } /*Show the Video PTS bit32 value*/ -static ssize_t demux_show_video_pts_bit32(struct class *class, +static ssize_t video_pts_bit32_show(struct class *class, struct class_attribute *attr, char *buf) { struct aml_dvb *dvb = &aml_dvb_device; @@ -1554,7 +1569,7 @@ static ssize_t demux_show_video_pts_bit32(struct class *class, } /*Show the Audio PTS bit32 value*/ -static ssize_t demux_show_audio_pts_bit32(struct class *class, +static ssize_t audio_pts_bit32_show(struct class *class, struct class_attribute *attr, char *buf) { struct aml_dvb *dvb = &aml_dvb_device; @@ -1567,7 +1582,7 @@ static ssize_t demux_show_audio_pts_bit32(struct class *class, /*Show the First Video PTS value*/ -static ssize_t demux_show_first_video_pts(struct class *class, +static ssize_t first_video_pts_show(struct class *class, struct class_attribute *attr, char *buf) { @@ -1580,7 +1595,7 @@ static ssize_t demux_show_first_video_pts(struct class *class, } /*Show the First Audio PTS value*/ -static ssize_t demux_show_first_audio_pts(struct class *class, +static ssize_t first_audio_pts_show(struct class *class, struct class_attribute *attr, char *buf) { @@ -1592,7 +1607,7 @@ static ssize_t demux_show_first_audio_pts(struct class *class, return ret; } -static ssize_t stb_show_hw_setting(struct class *class, +static ssize_t hw_setting_show(struct class *class, struct class_attribute *attr, char *buf) { int r, total = 0; @@ -1621,7 +1636,7 @@ static ssize_t stb_show_hw_setting(struct class *class, return total; } -static ssize_t stb_store_hw_setting(struct class *class, +static ssize_t hw_setting_store(struct class *class, struct class_attribute *attr, const char *buf, size_t count) { @@ -1690,7 +1705,7 @@ static ssize_t stb_store_hw_setting(struct class *class, return count; } -static ssize_t stb_show_tuner_setting(struct class *class, +static ssize_t tuner_setting_show(struct class *class, struct class_attribute *attr, char *buf) { struct aml_dvb *dvb = &aml_dvb_device; @@ -1704,7 +1719,7 @@ static ssize_t stb_show_tuner_setting(struct class *class, return 0; } -static ssize_t stb_store_tuner_setting(struct class *class, +static ssize_t tuner_setting_store(struct class *class, struct class_attribute *attr, const char *buf, size_t count) { @@ -1766,144 +1781,296 @@ EXIT: return count; } -static struct class_attribute aml_stb_class_attrs[] = { - __ATTR(hw_setting, 0664, stb_show_hw_setting, - stb_store_hw_setting), - __ATTR(source, 0664, stb_show_source, - stb_store_source), - __ATTR(demux_reset_all_flag, 0664, show_dmx_reset_all_flag, - set_dmx_reset_all_flag), - __ATTR(tso_source, 0644, tso_show_source, - tso_store_source), +static CLASS_ATTR_RW(hw_setting); +static CLASS_ATTR_RW(source); +static CLASS_ATTR_RW(demux_reset_all_flag); +static CLASS_ATTR_RW(tso_source); #define DEMUX_SOURCE_ATTR_PCR(i)\ - __ATTR(demux##i##_pcr, 0644, demux##i##_show_pcr, NULL) + static CLASS_ATTR_RO(demux##i##_pcr) #define DEMUX_SOURCE_ATTR_DECL(i)\ - __ATTR(demux##i##_source, 0664,\ - demux##i##_show_source, demux##i##_store_source) + static CLASS_ATTR_RW(demux##i##_source) #define DEMUX_FREE_FILTERS_ATTR_DECL(i)\ - __ATTR(demux##i##_free_filters, 0644, \ - demux##i##_show_free_filters, NULL) + static CLASS_ATTR_RO(demux##i##_free_filters) #define DEMUX_FILTER_USERS_ATTR_DECL(i)\ - __ATTR(demux##i##_filter_users, 0644, \ - demux##i##_show_filter_users, demux##i##_store_filter_used) + static CLASS_ATTR_RW(demux##i##_filter_users) #define DVR_MODE_ATTR_DECL(i)\ - __ATTR(dvr##i##_mode, 0644, dvr##i##_show_mode, \ - dvr##i##_store_mode) + static CLASS_ATTR_RW(dvr##i##_mode) #define DEMUX_TS_HEADER_ATTR_DECL(i)\ - __ATTR(demux##i##_ts_header, 0644, \ - demux##i##_show_ts_header, NULL) + static CLASS_ATTR_RO(demux##i##_ts_header) #define DEMUX_CHANNEL_ACTIVITY_ATTR_DECL(i)\ - __ATTR(demux##i##_channel_activity, 0644, \ - demux##i##_show_channel_activity, NULL) + static CLASS_ATTR_RO(demux##i##_channel_activity) #define DMX_RESET_ATTR_DECL(i)\ - __ATTR(demux##i##_reset, 0644, NULL, \ - demux##i##_reset_store) + static CLASS_ATTR_WO(demux##i##_reset) #if DMX_DEV_COUNT > 0 - DEMUX_SOURCE_ATTR_PCR(0), - DEMUX_SOURCE_ATTR_DECL(0), - DEMUX_FREE_FILTERS_ATTR_DECL(0), - DEMUX_FILTER_USERS_ATTR_DECL(0), - DVR_MODE_ATTR_DECL(0), - DEMUX_TS_HEADER_ATTR_DECL(0), - DEMUX_CHANNEL_ACTIVITY_ATTR_DECL(0), - DMX_RESET_ATTR_DECL(0), + DEMUX_SOURCE_ATTR_PCR(0); + DEMUX_SOURCE_ATTR_DECL(0); + DEMUX_FREE_FILTERS_ATTR_DECL(0); + DEMUX_FILTER_USERS_ATTR_DECL(0); + DVR_MODE_ATTR_DECL(0); + DEMUX_TS_HEADER_ATTR_DECL(0); + DEMUX_CHANNEL_ACTIVITY_ATTR_DECL(0); + DMX_RESET_ATTR_DECL(0); #endif #if DMX_DEV_COUNT > 1 - DEMUX_SOURCE_ATTR_PCR(1), - DEMUX_SOURCE_ATTR_DECL(1), - DEMUX_FREE_FILTERS_ATTR_DECL(1), - DEMUX_FILTER_USERS_ATTR_DECL(1), - DVR_MODE_ATTR_DECL(1), - DEMUX_TS_HEADER_ATTR_DECL(1), - DEMUX_CHANNEL_ACTIVITY_ATTR_DECL(1), - DMX_RESET_ATTR_DECL(1), + DEMUX_SOURCE_ATTR_PCR(1); + DEMUX_SOURCE_ATTR_DECL(1); + DEMUX_FREE_FILTERS_ATTR_DECL(1); + DEMUX_FILTER_USERS_ATTR_DECL(1); + DVR_MODE_ATTR_DECL(1); + DEMUX_TS_HEADER_ATTR_DECL(1); + DEMUX_CHANNEL_ACTIVITY_ATTR_DECL(1); + DMX_RESET_ATTR_DECL(1); #endif #if DMX_DEV_COUNT > 2 - DEMUX_SOURCE_ATTR_PCR(2), - DEMUX_SOURCE_ATTR_DECL(2), - DEMUX_FREE_FILTERS_ATTR_DECL(2), - DEMUX_FILTER_USERS_ATTR_DECL(2), - DVR_MODE_ATTR_DECL(2), - DEMUX_TS_HEADER_ATTR_DECL(2), - DEMUX_CHANNEL_ACTIVITY_ATTR_DECL(2), - DMX_RESET_ATTR_DECL(2), + DEMUX_SOURCE_ATTR_PCR(2); + DEMUX_SOURCE_ATTR_DECL(2); + DEMUX_FREE_FILTERS_ATTR_DECL(2); + DEMUX_FILTER_USERS_ATTR_DECL(2); + DVR_MODE_ATTR_DECL(2); + DEMUX_TS_HEADER_ATTR_DECL(2); + DEMUX_CHANNEL_ACTIVITY_ATTR_DECL(2); + DMX_RESET_ATTR_DECL(2); #endif #define ASYNCFIFO_SOURCE_ATTR_DECL(i)\ - __ATTR(asyncfifo##i##_source, 0664, \ - asyncfifo##i##_show_source, asyncfifo##i##_store_source) + static CLASS_ATTR_RW(asyncfifo##i##_source) #define ASYNCFIFO_FLUSHSIZE_ATTR_DECL(i)\ - __ATTR(asyncfifo##i##_flush_size, 0664,\ - asyncfifo##i##_show_flush_size, \ - asyncfifo##i##_store_flush_size) + static CLASS_ATTR_RW(asyncfifo##i##_flush_size) #define ASYNCFIFO_SECUREADDR_ATTR_DECL(i)\ - __ATTR(asyncfifo##i##_secure_addr, S_IRUGO | S_IWUSR | S_IWGRP,\ - asyncfifo##i##_show_secure_addr, \ - asyncfifo##i##_store_secure_addr) + static CLASS_ATTR_RW(asyncfifo##i##_secure_addr) #define ASYNCFIFO_SECURENABLE_ATTR_DECL(i)\ - __ATTR(asyncfifo##i##_secure_enable, S_IRUGO | S_IWUSR | S_IWGRP,\ - asyncfifo##i##_show_secure_enable, \ - asyncfifo##i##_store_secure_enable) + static CLASS_ATTR_RW(asyncfifo##i##_secure_enable) #if ASYNCFIFO_COUNT > 0 - ASYNCFIFO_SOURCE_ATTR_DECL(0), - ASYNCFIFO_FLUSHSIZE_ATTR_DECL(0), - ASYNCFIFO_SECUREADDR_ATTR_DECL(0), - ASYNCFIFO_SECURENABLE_ATTR_DECL(0), + ASYNCFIFO_SOURCE_ATTR_DECL(0); + ASYNCFIFO_FLUSHSIZE_ATTR_DECL(0); + ASYNCFIFO_SECUREADDR_ATTR_DECL(0); + ASYNCFIFO_SECURENABLE_ATTR_DECL(0); #endif #if ASYNCFIFO_COUNT > 1 - ASYNCFIFO_SOURCE_ATTR_DECL(1), - ASYNCFIFO_FLUSHSIZE_ATTR_DECL(1), - ASYNCFIFO_SECUREADDR_ATTR_DECL(1), - ASYNCFIFO_SECURENABLE_ATTR_DECL(1), + ASYNCFIFO_SOURCE_ATTR_DECL(1); + ASYNCFIFO_FLUSHSIZE_ATTR_DECL(1); + ASYNCFIFO_SECUREADDR_ATTR_DECL(1); + ASYNCFIFO_SECURENABLE_ATTR_DECL(1); #endif #if ASYNCFIFO_COUNT > 2 - ASYNCFIFO_SOURCE_ATTR_DECL(2), - ASYNCFIFO_FLUSHSIZE_ATTR_DECL(2), - ASYNCFIFO_SECUREADDR_ATTR_DECL(2), - ASYNCFIFO_SECURENABLE_ATTR_DECL(2), + ASYNCFIFO_SOURCE_ATTR_DECL(2); + ASYNCFIFO_FLUSHSIZE_ATTR_DECL(2); + ASYNCFIFO_SECUREADDR_ATTR_DECL(2); + ASYNCFIFO_SECURENABLE_ATTR_DECL(2); #endif - __ATTR(demux_reset, 0644, NULL, demux_do_reset), - __ATTR(video_pts, 0664, demux_show_video_pts, - NULL), - __ATTR(audio_pts, 0664, demux_show_audio_pts, - NULL), - __ATTR(video_pts_bit32, 0644, demux_show_video_pts_bit32, NULL), - __ATTR(audio_pts_bit32, 0644, demux_show_audio_pts_bit32, NULL), - __ATTR(first_video_pts, 0644, demux_show_first_video_pts, - NULL), - __ATTR(first_audio_pts, 0644, demux_show_first_audio_pts, - NULL), - __ATTR(clear_av, 0644, NULL, stb_clear_av), + static CLASS_ATTR_WO(demux_reset); + static CLASS_ATTR_RO(video_pts); + static CLASS_ATTR_RO(audio_pts); + static CLASS_ATTR_RO(video_pts_bit32); + static CLASS_ATTR_RO(audio_pts_bit32); + static CLASS_ATTR_RO(first_video_pts); + static CLASS_ATTR_RO(first_audio_pts); + static CLASS_ATTR_WO(clear_av); #define DSC_SOURCE_ATTR_DECL(i)\ - __ATTR(dsc##i##_source, 0664,\ - dsc##i##_show_source, dsc##i##_store_source) + static CLASS_ATTR_RW(dsc##i##_source) #define DSC_FREE_ATTR_DECL(i) \ - __ATTR(dsc##i##_free_dscs, 0644, \ - dsc##i##_show_free_dscs, NULL) + static CLASS_ATTR_RO(dsc##i##_free_dscs) #if DSC_DEV_COUNT > 0 - DSC_SOURCE_ATTR_DECL(0), - DSC_FREE_ATTR_DECL(0), + DSC_SOURCE_ATTR_DECL(0); + DSC_FREE_ATTR_DECL(0); #endif #if DSC_DEV_COUNT > 1 - DSC_SOURCE_ATTR_DECL(1), - DSC_FREE_ATTR_DECL(1), + DSC_SOURCE_ATTR_DECL(1); + DSC_FREE_ATTR_DECL(1); #endif - __ATTR(tuner_setting, 0664, stb_show_tuner_setting, stb_store_tuner_setting), + static CLASS_ATTR_RW(tuner_setting); +#define STB_ATTR(name) &class_attr_##name.attr + +static struct attribute *aml_stb_class_attrs[] = { + STB_ATTR(hw_setting), + STB_ATTR(source), + STB_ATTR(demux_reset_all_flag), + STB_ATTR(tso_source), + STB_ATTR(demux_reset), + STB_ATTR(video_pts), + STB_ATTR(audio_pts), + STB_ATTR(video_pts_bit32), + STB_ATTR(audio_pts_bit32), + STB_ATTR(first_video_pts), + STB_ATTR(first_audio_pts), + STB_ATTR(clear_av), + STB_ATTR(tuner_setting), +#define DEMUX_PCR(i) \ + STB_ATTR(demux##i##_pcr) + DEMUX_PCR(0), + DEMUX_PCR(1), + DEMUX_PCR(2), +#define DEMUX_SOURCE(i) \ + STB_ATTR(demux##i##_source) + DEMUX_SOURCE(0), + DEMUX_SOURCE(1), + DEMUX_SOURCE(2), +#define DEMUX_FREE_FILTER(i) \ + STB_ATTR(demux##i##_free_filters) + DEMUX_FREE_FILTER(0), + DEMUX_FREE_FILTER(1), + DEMUX_FREE_FILTER(2), +#define DEMUX_FILTER_USERS(i) \ + STB_ATTR(demux##i##_filter_users) + DEMUX_FILTER_USERS(0), + DEMUX_FILTER_USERS(1), + DEMUX_FILTER_USERS(2), +#define DEMUX_TS_HEADER(i) \ + STB_ATTR(demux##i##_ts_header) + DEMUX_TS_HEADER(0), + DEMUX_TS_HEADER(1), + DEMUX_TS_HEADER(2), +#define DEMUX_CHANNEL_ACTIVITY_ATTR(i) \ + STB_ATTR(demux##i##_channel_activity) + DEMUX_CHANNEL_ACTIVITY_ATTR(0), + DEMUX_CHANNEL_ACTIVITY_ATTR(1), + DEMUX_CHANNEL_ACTIVITY_ATTR(2), +#define DEMUX_RESET(i) \ + STB_ATTR(demux##i##_reset) + DEMUX_RESET(0), + DEMUX_RESET(1), + DEMUX_RESET(2), +#define DVR_MODE(i)\ + STB_ATTR(dvr##i##_mode) + DVR_MODE(0), + DVR_MODE(1), + DVR_MODE(2), +#define ASYNCFIFO_SOURCE(i) \ + STB_ATTR(asyncfifo##i##_source) +#if ASYNCFIFO_COUNT > 0 + ASYNCFIFO_SOURCE(0), +#endif +#if ASYNCFIFO_COUNT > 1 + ASYNCFIFO_SOURCE(1), +#endif +#if ASYNCFIFO_COUNT > 2 + ASYNCFIFO_SOURCE(2), +#endif +#define ASYNCFIFO_FLUSH_SIZE(i) \ + STB_ATTR(asyncfifo##i##_flush_size) +#if ASYNCFIFO_COUNT > 0 + ASYNCFIFO_FLUSH_SIZE(0), +#endif +#if ASYNCFIFO_COUNT > 1 + ASYNCFIFO_FLUSH_SIZE(1), +#endif +#if ASYNCFIFO_COUNT > 2 + ASYNCFIFO_FLUSH_SIZE(2), +#endif + +#define ASYNCFIFO_SECURE_ADDR(i) \ + STB_ATTR(asyncfifo##i##_secure_addr) +#if ASYNCFIFO_COUNT > 0 + ASYNCFIFO_SECURE_ADDR(0), +#endif +#if ASYNCFIFO_COUNT > 1 + ASYNCFIFO_SECURE_ADDR(1), +#endif +#if ASYNCFIFO_COUNT > 2 + ASYNCFIFO_SECURE_ADDR(2), +#endif - __ATTR_NULL +#define ASYNCFIFO_SECURE_ENABLE(i)\ + STB_ATTR(asyncfifo##i##_secure_enable) +#if ASYNCFIFO_COUNT > 0 + ASYNCFIFO_SECURE_ENABLE(0), +#endif +#if ASYNCFIFO_COUNT > 1 + ASYNCFIFO_SECURE_ENABLE(1), +#endif +#if ASYNCFIFO_COUNT > 2 + ASYNCFIFO_SECURE_ENABLE(2), +#endif +#define DSC_SOURCE(i) \ + STB_ATTR(dsc##i##_source) +#if DSC_DEV_COUNT > 0 + DSC_SOURCE(0), +#endif +#if DSC_DEV_COUNT > 1 + DSC_SOURCE(1), +#endif +#define DSC_FREE_DSCS(i) \ + STB_ATTR(dsc##i##_free_dscs) +#if DSC_DEV_COUNT > 0 + DSC_FREE_DSCS(0), +#endif +#if DSC_DEV_COUNT > 1 + DSC_FREE_DSCS(1), +#endif + NULL }; + +ATTRIBUTE_GROUPS(aml_stb_class); + static struct class aml_stb_class = { .name = "stb", - .class_attrs = aml_stb_class_attrs, + .class_groups = aml_stb_class_groups, }; +static int s_add_s2p2 = 0; +static int s_add_ts_in = 0; +static int s_add_asyncfifo = 0; + +static int get_hw_config(struct platform_device *pdev) { + char buf[32]; + u32 value; + int ret = 0; + + if (pdev->dev.of_node) { + memset(buf, 0, 32); + snprintf(buf, sizeof(buf), "key_endia"); + ret = of_property_read_u32(pdev->dev.of_node, buf, + &value); + if (!ret) { + pr_inf("%s: 0x%x\n", buf, value); + dsc_set_key_endia(value); + } else { + pr_inf("read error:%s: 0x%x\n", buf, value); + } + + memset(buf, 0, 32); + snprintf(buf, sizeof(buf), "add_s2p2"); + ret = of_property_read_u32(pdev->dev.of_node, buf, + &value); + if (!ret) { + pr_inf("%s: 0x%x\n", buf, value); + s_add_s2p2 = value; + aml_s2p_add(value); + } else { + pr_inf("read error:%s: 0x%x\n", buf, value); + } + + memset(buf, 0, 32); + snprintf(buf, sizeof(buf), "add_ts_in"); + ret = of_property_read_u32(pdev->dev.of_node, buf, + &value); + if (!ret) { + pr_inf("%s: 0x%x\n", buf, value); + s_add_ts_in = value; + } else { + pr_inf("read error:%s: 0x%x\n", buf, value); + } + + memset(buf, 0, 32); + snprintf(buf, sizeof(buf), "add_asyncfifo"); + ret = of_property_read_u32(pdev->dev.of_node, buf, + &value); + if (!ret) { + pr_inf("%s: 0x%x\n", buf, value); + s_add_asyncfifo = value; + } else { + pr_inf("read error:%s: 0x%x\n", buf, value); + } + } + return 0; +} /* *extern int aml_regist_dmx_class(void); @@ -1927,30 +2094,6 @@ static int aml_dvb_probe(struct platform_device *pdev) pr_dbg("probe amlogic dvb driver [%s]\n", DVB_VERSION); - /*switch_mod_gate_by_name("demux", 1); */ -#if 0 - /*no used reset ctl to set clk*/ - aml_dvb_demux_reset_ctl = - devm_reset_control_get(&pdev->dev, "demux"); - pr_inf("dmx rst ctl = %p\n", aml_dvb_demux_reset_ctl); - reset_control_deassert(aml_dvb_demux_reset_ctl); - - aml_dvb_afifo_reset_ctl = - devm_reset_control_get(&pdev->dev, "asyncfifo"); - pr_inf("asyncfifo rst ctl = %p\n", aml_dvb_afifo_reset_ctl); - reset_control_deassert(aml_dvb_afifo_reset_ctl); - - aml_dvb_ahbarb0_reset_ctl = - devm_reset_control_get(&pdev->dev, "ahbarb0"); - pr_inf("ahbarb0 rst ctl = %p\n", aml_dvb_ahbarb0_reset_ctl); - reset_control_deassert(aml_dvb_ahbarb0_reset_ctl); - - aml_dvb_uparsertop_reset_ctl = - devm_reset_control_get(&pdev->dev, "uparsertop"); - pr_inf("uparsertop rst ctl = %p\n", aml_dvb_uparsertop_reset_ctl); - reset_control_deassert(aml_dvb_uparsertop_reset_ctl); -#else - if (get_cpu_type() < MESON_CPU_MAJOR_ID_G12A) { aml_dvb_demux_clk = @@ -1990,18 +2133,15 @@ static int aml_dvb_probe(struct platform_device *pdev) amports_switch_gate("demux", 1); amports_switch_gate("ahbarb0", 1); amports_switch_gate("parser_top", 1); - if (get_cpu_type() == MESON_CPU_MAJOR_ID_TL1) - { - aml_dvb_afifo_clk = + aml_dvb_afifo_clk = devm_clk_get(&pdev->dev, "asyncfifo"); - if (IS_ERR_OR_NULL(aml_dvb_afifo_clk)) { - dev_err(&pdev->dev, "get asyncfifo clk fail\n"); - return -1; - } + if (IS_ERR_OR_NULL(aml_dvb_afifo_clk)) { + dev_err(&pdev->dev, "get asyncfifo clk fail\n"); + } else { clk_prepare_enable(aml_dvb_afifo_clk); } } -#endif + advb = &aml_dvb_device; memset(advb, 0, sizeof(aml_dvb_device)); @@ -2012,15 +2152,11 @@ static int aml_dvb_probe(struct platform_device *pdev) advb->stb_source = -1; advb->tso_source = -1; - if (get_cpu_type() < MESON_CPU_MAJOR_ID_TL1) { - advb->ts_in_total_count = 3; - advb->s2p_total_count = 2; - advb->async_fifo_total_count = 2; - } else { - advb->ts_in_total_count = 4; - advb->s2p_total_count = 3; - advb->async_fifo_total_count = 3; - } + get_hw_config(pdev); + + advb->ts_in_total_count = 3 + s_add_ts_in; + advb->s2p_total_count = 2 + s_add_s2p2; + advb->async_fifo_total_count = 2 + s_add_asyncfifo; for (i = 0; i < DMX_DEV_COUNT; i++) { advb->dmx[i].dmx_irq = -1; @@ -2166,7 +2302,7 @@ static int aml_dvb_probe(struct platform_device *pdev) tsdemux_set_ops(NULL); #endif - //pengcc add for dvb using linux TV frontend api init + //add for dvb using linux TV frontend api init { struct demod_config config; char buf[32]; @@ -2561,7 +2697,7 @@ static int aml_dvb_remove(struct platform_device *pdev) amports_switch_gate("ahbarb0", 0); amports_switch_gate("parser_top", 0); - if (get_cpu_type() == MESON_CPU_MAJOR_ID_TL1) { + if (!IS_ERR_OR_NULL(aml_dvb_afifo_clk)) { clk_disable_unprepare(aml_dvb_afifo_clk); } } diff --git a/drivers/stream_input/parser/hw_demux/aml_dvb.h b/drivers/stream_input/parser/hw_demux/aml_dvb.h index 5c943c8..340dc5b 100644 --- a/drivers/stream_input/parser/hw_demux/aml_dvb.h +++ b/drivers/stream_input/parser/hw_demux/aml_dvb.h @@ -41,7 +41,6 @@ #include <linux/earlysuspend.h> #endif - #include <dvbdev.h> #include <demux.h> #include <dvb_demux.h> @@ -49,6 +48,7 @@ #include <dvb_filter.h> #include <dvb_net.h> #include <dvb_ringbuffer.h> +#include <dvb_frontend.h> #include <linux/of.h> #include <linux/pinctrl/consumer.h> @@ -75,31 +75,6 @@ #define SEC_BUF_BUSY_SIZE 4 #define SEC_BUF_COUNT (SEC_BUF_GRP_COUNT*8) -enum aml_dmx_id_t { - AM_DMX_0 = 0, - AM_DMX_1, - AM_DMX_2, - AM_DMX_MAX, -}; - -enum aml_ts_source_t { - AM_TS_SRC_TS0, - AM_TS_SRC_TS1, - AM_TS_SRC_TS2, - AM_TS_SRC_TS3, - - AM_TS_SRC_S_TS0, - AM_TS_SRC_S_TS1, - AM_TS_SRC_S_TS2, - AM_TS_SRC_S_TS3, - - AM_TS_SRC_HIU, - AM_TS_SRC_HIU1, - AM_TS_SRC_DMX0, - AM_TS_SRC_DMX1, - AM_TS_SRC_DMX2 -}; - struct aml_sec_buf { unsigned long addr; int len; @@ -368,7 +343,8 @@ extern int dsc_set_key(struct aml_dsc_channel *ch, int flags, enum ca_cw_type type, u8 *key); extern void dsc_release(void); extern int aml_ciplus_hw_set_source(int src); - +extern int dsc_set_key_endia(int key_endia); +extern int aml_s2p_add(int num); /*AMLogic ASYNC FIFO interface*/ extern int aml_asyncfifo_hw_init(struct aml_asyncfifo *afifo); extern int aml_asyncfifo_hw_deinit(struct aml_asyncfifo *afifo); diff --git a/drivers/stream_input/parser/hw_demux/aml_dvb_reg.h b/drivers/stream_input/parser/hw_demux/aml_dvb_reg.h index dbfa6ba..07fb423 100644 --- a/drivers/stream_input/parser/hw_demux/aml_dvb_reg.h +++ b/drivers/stream_input/parser/hw_demux/aml_dvb_reg.h @@ -18,9 +18,9 @@ #ifndef _DVB_REG_H_ #define _DVB_REG_H_ -#include <linux/amlogic/iomap.h> - -#include <linux/amlogic/cpu_version.h> +//#include <linux/amlogic/iomap.h> +#include <linux/amlogic/media/registers/register_map.h> +//#include <linux/amlogic/cpu_version.h> #define ID_STB_CBUS_BASE 0 #define ID_SMARTCARD_REG_BASE 1 diff --git a/drivers/stream_input/parser/hw_demux/c_stb_regs_define.h b/drivers/stream_input/parser/hw_demux/c_stb_regs_define.h index b12db68..e351771 100644 --- a/drivers/stream_input/parser/hw_demux/c_stb_regs_define.h +++ b/drivers/stream_input/parser/hw_demux/c_stb_regs_define.h @@ -27,7 +27,7 @@ #ifndef __MACH_MESON8_REG_ADDR_H_ #define __MACH_MESON8_REG_ADDR_H_ -#include <linux/amlogic/iomap.h> +#include <linux/amlogic/media/registers/register_map.h> #define CBUS_REG_ADDR(_r) aml_read_cbus(_r) |