* [PATCH v2 0/5] STi drivers cleanup
@ 2025-09-12 11:36 Raphael Gallais-Pou
2025-09-12 11:36 ` [PATCH v2 1/5] media: c8sectpfe: remove support of STi c8sectpfe driver Raphael Gallais-Pou
` (4 more replies)
0 siblings, 5 replies; 18+ messages in thread
From: Raphael Gallais-Pou @ 2025-09-12 11:36 UTC (permalink / raw)
To: Patrice Chotard, Mauro Carvalho Chehab, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Michael Turquette,
Stephen Boyd
Cc: linux-kernel, linux-media, devicetree, linux-clk
With B2120 board removal[1] several drivers are left unused.
Remove the following compatibles:
- st,flexgen-stih407-a0
- st,flexgen-stih407-c0
- st,flexgen-stih407-d0
- st,stih407-c8sectpfe
[1] commit dee546e1adef ("ARM: sti: drop B2120 board support")
Signed-off-by: Raphael Gallais-Pou <rgallaispou@gmail.com>
---
Changes in v2:
- Fix Patrice's email
- Documentation:
- Remove media admin-guide c8sectpfe description
- Remove c8sectpfe dt-bindings header
- Driver:
- Remove c8sectpfe media occurence in platform Makefile
- Link to v1: https://lore.kernel.org/r/20250911-master-v1-0-5d5d5ea9af22@gmail.com
---
Raphael Gallais-Pou (5):
media: c8sectpfe: remove support of STi c8sectpfe driver
media: include: remove c8sectpfe header
dt-bindings: media: remove support of stih407-c8sectpfe
clk: st: flexgen: remove unused compatible
dt-bindings: clock: st: flexgen: remove deprecated compatibles
.../admin-guide/media/platform-cardlist.rst | 2 -
.../devicetree/bindings/clock/st/st,flexgen.txt | 3 -
.../bindings/media/stih407-c8sectpfe.txt | 88 --
MAINTAINERS | 1 -
drivers/clk/st/clk-flexgen.c | 80 --
drivers/media/platform/st/Makefile | 1 -
drivers/media/platform/st/sti/Kconfig | 1 -
drivers/media/platform/st/sti/Makefile | 1 -
drivers/media/platform/st/sti/c8sectpfe/Kconfig | 28 -
drivers/media/platform/st/sti/c8sectpfe/Makefile | 11 -
.../platform/st/sti/c8sectpfe/c8sectpfe-common.c | 262 -----
.../platform/st/sti/c8sectpfe/c8sectpfe-common.h | 60 -
.../platform/st/sti/c8sectpfe/c8sectpfe-core.c | 1158 --------------------
.../platform/st/sti/c8sectpfe/c8sectpfe-core.h | 287 -----
.../platform/st/sti/c8sectpfe/c8sectpfe-debugfs.c | 244 -----
.../platform/st/sti/c8sectpfe/c8sectpfe-debugfs.h | 23 -
.../platform/st/sti/c8sectpfe/c8sectpfe-dvb.c | 235 ----
.../platform/st/sti/c8sectpfe/c8sectpfe-dvb.h | 17 -
include/dt-bindings/media/c8sectpfe.h | 13 -
19 files changed, 2515 deletions(-)
---
base-commit: 8f21d9da46702c4d6951ba60ca8a05f42870fe8f
change-id: 20250908-master-5c5c980cfb03
Best regards,
--
Raphael Gallais-Pou <rgallaispou@gmail.com>
^ permalink raw reply [flat|nested] 18+ messages in thread* [PATCH v2 1/5] media: c8sectpfe: remove support of STi c8sectpfe driver 2025-09-12 11:36 [PATCH v2 0/5] STi drivers cleanup Raphael Gallais-Pou @ 2025-09-12 11:36 ` Raphael Gallais-Pou 2025-09-12 14:24 ` Patrice CHOTARD 2025-09-12 11:36 ` [PATCH v2 2/5] media: include: remove c8sectpfe header Raphael Gallais-Pou ` (3 subsequent siblings) 4 siblings, 1 reply; 18+ messages in thread From: Raphael Gallais-Pou @ 2025-09-12 11:36 UTC (permalink / raw) To: Patrice Chotard, Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Michael Turquette, Stephen Boyd Cc: linux-kernel, linux-media, devicetree, linux-clk STi c8sectpfe device is only used on B2120 boards, which support has been withdrawn in commit dee546e1adef ("ARM: sti: drop B2120 board support"). Signed-off-by: Raphael Gallais-Pou <rgallaispou@gmail.com> --- MAINTAINERS | 1 - drivers/media/platform/st/Makefile | 1 - drivers/media/platform/st/sti/Kconfig | 1 - drivers/media/platform/st/sti/Makefile | 1 - drivers/media/platform/st/sti/c8sectpfe/Kconfig | 28 - drivers/media/platform/st/sti/c8sectpfe/Makefile | 11 - .../platform/st/sti/c8sectpfe/c8sectpfe-common.c | 262 ----- .../platform/st/sti/c8sectpfe/c8sectpfe-common.h | 60 - .../platform/st/sti/c8sectpfe/c8sectpfe-core.c | 1158 -------------------- .../platform/st/sti/c8sectpfe/c8sectpfe-core.h | 287 ----- .../platform/st/sti/c8sectpfe/c8sectpfe-debugfs.c | 244 ----- .../platform/st/sti/c8sectpfe/c8sectpfe-debugfs.h | 23 - .../platform/st/sti/c8sectpfe/c8sectpfe-dvb.c | 235 ---- .../platform/st/sti/c8sectpfe/c8sectpfe-dvb.h | 17 - 14 files changed, 2329 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index 7b7396ed28a700a2aab318553ce8ba1788312bff..ed5bc86ec5638ed6e0635b8ce0120f8f27435ff0 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3413,7 +3413,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 diff --git a/drivers/media/platform/st/Makefile b/drivers/media/platform/st/Makefile index a1f75b2a822583c931f2696e3fffd7981d87917b..615a93d62662105c51af076345da7f3bdc86227c 100644 --- a/drivers/media/platform/st/Makefile +++ b/drivers/media/platform/st/Makefile @@ -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/ diff --git a/drivers/media/platform/st/sti/Kconfig b/drivers/media/platform/st/sti/Kconfig index 60068e8b47b8651e0c2e64121441faef9061933c..91ca0950ff7308d9414d75bfbb2a0e815e7a2104 100644 --- a/drivers/media/platform/st/sti/Kconfig +++ b/drivers/media/platform/st/sti/Kconfig @@ -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" diff --git a/drivers/media/platform/st/sti/Makefile b/drivers/media/platform/st/sti/Makefile index f9ce8169b0404cef2a7de8f1c7377f8abe511829..3328d50fb6cf2ed2daae2c0640a6596fdd140be5 100644 --- a/drivers/media/platform/st/sti/Makefile +++ b/drivers/media/platform/st/sti/Makefile @@ -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/ diff --git a/drivers/media/platform/st/sti/c8sectpfe/Kconfig b/drivers/media/platform/st/sti/c8sectpfe/Kconfig deleted file mode 100644 index 01c33d9c9ec37ddc9dfc94991e2e9d3b720111e7..0000000000000000000000000000000000000000 --- a/drivers/media/platform/st/sti/c8sectpfe/Kconfig +++ /dev/null @@ -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. diff --git a/drivers/media/platform/st/sti/c8sectpfe/Makefile b/drivers/media/platform/st/sti/c8sectpfe/Makefile deleted file mode 100644 index 99425137ee0a9e48b997d62215d4378075024c69..0000000000000000000000000000000000000000 --- a/drivers/media/platform/st/sti/c8sectpfe/Makefile +++ /dev/null @@ -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/ diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-common.c b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-common.c deleted file mode 100644 index 5df67da25525cbfec8b5890fdd626f634408a6f0..0000000000000000000000000000000000000000 --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-common.c +++ /dev/null @@ -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; -} diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-common.h b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-common.h deleted file mode 100644 index f8d97841f366e32d1087d135bdda8edbb14c1399..0000000000000000000000000000000000000000 --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-common.h +++ /dev/null @@ -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 diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.c b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.c deleted file mode 100644 index 89bd15a4d26a95be5576ba5f666fa20f4d010728..0000000000000000000000000000000000000000 --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.c +++ /dev/null @@ -1,1158 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * c8sectpfe-core.c - C8SECTPFE STi DVB driver - * - * Copyright (c) STMicroelectronics 2015 - * - * Author:Peter Bennett <peter.bennett@st.com> - * Peter Griffin <peter.griffin@linaro.org> - * - */ -#include <linux/atomic.h> -#include <linux/clk.h> -#include <linux/completion.h> -#include <linux/delay.h> -#include <linux/device.h> -#include <linux/dma-mapping.h> -#include <linux/dvb/dmx.h> -#include <linux/dvb/frontend.h> -#include <linux/err.h> -#include <linux/errno.h> -#include <linux/firmware.h> -#include <linux/gpio/consumer.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/io.h> -#include <linux/module.h> -#include <linux/of_platform.h> -#include <linux/pinctrl/consumer.h> -#include <linux/pinctrl/pinctrl.h> -#include <linux/platform_device.h> -#include <linux/slab.h> -#include <linux/time.h> -#include <linux/usb.h> -#include <linux/wait.h> - -#include "c8sectpfe-common.h" -#include "c8sectpfe-core.h" -#include "c8sectpfe-debugfs.h" - -#include <media/dmxdev.h> -#include <media/dvb_demux.h> -#include <media/dvb_frontend.h> -#include <media/dvb_net.h> - -#define FIRMWARE_MEMDMA "pti_memdma_h407.elf" -MODULE_FIRMWARE(FIRMWARE_MEMDMA); - -#define PID_TABLE_SIZE 1024 -#define POLL_MSECS 50 - -static int load_c8sectpfe_fw(struct c8sectpfei *fei); - -#define TS_PKT_SIZE 188 -#define HEADER_SIZE (4) -#define PACKET_SIZE (TS_PKT_SIZE+HEADER_SIZE) - -#define FEI_ALIGNMENT (32) -/* hw requires minimum of 8*PACKET_SIZE and padded to 8byte boundary */ -#define FEI_BUFFER_SIZE (8*PACKET_SIZE*340) - -#define FIFO_LEN 1024 - -static void c8sectpfe_timer_interrupt(struct timer_list *t) -{ - struct c8sectpfei *fei = timer_container_of(fei, t, timer); - struct channel_info *channel; - int chan_num; - - /* iterate through input block channels */ - for (chan_num = 0; chan_num < fei->tsin_count; chan_num++) { - channel = fei->channel_data[chan_num]; - - /* is this descriptor initialised and TP enabled */ - if (channel->irec && readl(channel->irec + DMA_PRDS_TPENABLE)) - queue_work(system_bh_wq, &channel->bh_work); - } - - fei->timer.expires = jiffies + msecs_to_jiffies(POLL_MSECS); - add_timer(&fei->timer); -} - -static void channel_swdemux_bh_work(struct work_struct *t) -{ - struct channel_info *channel = from_work(channel, t, bh_work); - struct c8sectpfei *fei; - unsigned long wp, rp; - int pos, num_packets, n, size; - u8 *buf; - - if (unlikely(!channel || !channel->irec)) - return; - - fei = channel->fei; - - wp = readl(channel->irec + DMA_PRDS_BUSWP_TP(0)); - rp = readl(channel->irec + DMA_PRDS_BUSRP_TP(0)); - - pos = rp - channel->back_buffer_busaddr; - - /* has it wrapped */ - if (wp < rp) - wp = channel->back_buffer_busaddr + FEI_BUFFER_SIZE; - - size = wp - rp; - num_packets = size / PACKET_SIZE; - - /* manage cache so data is visible to CPU */ - dma_sync_single_for_cpu(fei->dev, - rp, - size, - DMA_FROM_DEVICE); - - buf = channel->back_buffer_aligned; - - dev_dbg(fei->dev, - "chan=%d channel=%p num_packets = %d, buf = %p, pos = 0x%x\n\trp=0x%lx, wp=0x%lx\n", - channel->tsin_id, channel, num_packets, buf, pos, rp, wp); - - for (n = 0; n < num_packets; n++) { - dvb_dmx_swfilter_packets( - &fei->c8sectpfe[0]-> - demux[channel->demux_mapping].dvb_demux, - &buf[pos], 1); - - pos += PACKET_SIZE; - } - - /* advance the read pointer */ - if (wp == (channel->back_buffer_busaddr + FEI_BUFFER_SIZE)) - writel(channel->back_buffer_busaddr, channel->irec + - DMA_PRDS_BUSRP_TP(0)); - else - writel(wp, channel->irec + DMA_PRDS_BUSRP_TP(0)); -} - -static int c8sectpfe_start_feed(struct dvb_demux_feed *dvbdmxfeed) -{ - struct dvb_demux *demux = dvbdmxfeed->demux; - struct stdemux *stdemux = demux->priv; - struct c8sectpfei *fei = stdemux->c8sectpfei; - struct channel_info *channel; - u32 tmp; - unsigned long *bitmap; - int ret; - - switch (dvbdmxfeed->type) { - case DMX_TYPE_TS: - break; - case DMX_TYPE_SEC: - break; - default: - dev_err(fei->dev, "%s:%d Error bailing\n" - , __func__, __LINE__); - return -EINVAL; - } - - if (dvbdmxfeed->type == DMX_TYPE_TS) { - switch (dvbdmxfeed->pes_type) { - case DMX_PES_VIDEO: - case DMX_PES_AUDIO: - case DMX_PES_TELETEXT: - case DMX_PES_PCR: - case DMX_PES_OTHER: - break; - default: - dev_err(fei->dev, "%s:%d Error bailing\n" - , __func__, __LINE__); - return -EINVAL; - } - } - - if (!atomic_read(&fei->fw_loaded)) { - ret = load_c8sectpfe_fw(fei); - if (ret) - return ret; - } - - mutex_lock(&fei->lock); - - channel = fei->channel_data[stdemux->tsin_index]; - - bitmap = channel->pid_buffer_aligned; - - /* 8192 is a special PID */ - if (dvbdmxfeed->pid == 8192) { - tmp = readl(fei->io + C8SECTPFE_IB_PID_SET(channel->tsin_id)); - tmp &= ~C8SECTPFE_PID_ENABLE; - writel(tmp, fei->io + C8SECTPFE_IB_PID_SET(channel->tsin_id)); - - } else { - bitmap_set(bitmap, dvbdmxfeed->pid, 1); - } - - /* manage cache so PID bitmap is visible to HW */ - dma_sync_single_for_device(fei->dev, - channel->pid_buffer_busaddr, - PID_TABLE_SIZE, - DMA_TO_DEVICE); - - channel->active = 1; - - if (fei->global_feed_count == 0) { - fei->timer.expires = jiffies + - msecs_to_jiffies(msecs_to_jiffies(POLL_MSECS)); - - add_timer(&fei->timer); - } - - if (stdemux->running_feed_count == 0) { - - dev_dbg(fei->dev, "Starting channel=%p\n", channel); - - INIT_WORK(&channel->bh_work, channel_swdemux_bh_work); - - /* Reset the internal inputblock sram pointers */ - writel(channel->fifo, - fei->io + C8SECTPFE_IB_BUFF_STRT(channel->tsin_id)); - writel(channel->fifo + FIFO_LEN - 1, - fei->io + C8SECTPFE_IB_BUFF_END(channel->tsin_id)); - - writel(channel->fifo, - fei->io + C8SECTPFE_IB_READ_PNT(channel->tsin_id)); - writel(channel->fifo, - fei->io + C8SECTPFE_IB_WRT_PNT(channel->tsin_id)); - - - /* reset read / write memdma ptrs for this channel */ - writel(channel->back_buffer_busaddr, channel->irec + - DMA_PRDS_BUSBASE_TP(0)); - - tmp = channel->back_buffer_busaddr + FEI_BUFFER_SIZE - 1; - writel(tmp, channel->irec + DMA_PRDS_BUSTOP_TP(0)); - - writel(channel->back_buffer_busaddr, channel->irec + - DMA_PRDS_BUSWP_TP(0)); - - /* Issue a reset and enable InputBlock */ - writel(C8SECTPFE_SYS_ENABLE | C8SECTPFE_SYS_RESET - , fei->io + C8SECTPFE_IB_SYS(channel->tsin_id)); - - /* and enable the tp */ - writel(0x1, channel->irec + DMA_PRDS_TPENABLE); - - dev_dbg(fei->dev, "%s:%d Starting DMA feed on stdemux=%p\n" - , __func__, __LINE__, stdemux); - } - - stdemux->running_feed_count++; - fei->global_feed_count++; - - mutex_unlock(&fei->lock); - - return 0; -} - -static int c8sectpfe_stop_feed(struct dvb_demux_feed *dvbdmxfeed) -{ - - struct dvb_demux *demux = dvbdmxfeed->demux; - struct stdemux *stdemux = demux->priv; - struct c8sectpfei *fei = stdemux->c8sectpfei; - struct channel_info *channel; - int idlereq; - u32 tmp; - int ret; - unsigned long *bitmap; - - if (!atomic_read(&fei->fw_loaded)) { - ret = load_c8sectpfe_fw(fei); - if (ret) - return ret; - } - - mutex_lock(&fei->lock); - - channel = fei->channel_data[stdemux->tsin_index]; - - bitmap = channel->pid_buffer_aligned; - - if (dvbdmxfeed->pid == 8192) { - tmp = readl(fei->io + C8SECTPFE_IB_PID_SET(channel->tsin_id)); - tmp |= C8SECTPFE_PID_ENABLE; - writel(tmp, fei->io + C8SECTPFE_IB_PID_SET(channel->tsin_id)); - } else { - bitmap_clear(bitmap, dvbdmxfeed->pid, 1); - } - - /* manage cache so data is visible to HW */ - dma_sync_single_for_device(fei->dev, - channel->pid_buffer_busaddr, - PID_TABLE_SIZE, - DMA_TO_DEVICE); - - if (--stdemux->running_feed_count == 0) { - - channel = fei->channel_data[stdemux->tsin_index]; - - /* TP re-configuration on page 168 of functional spec */ - - /* disable IB (prevents more TS data going to memdma) */ - writel(0, fei->io + C8SECTPFE_IB_SYS(channel->tsin_id)); - - /* disable this channels descriptor */ - writel(0, channel->irec + DMA_PRDS_TPENABLE); - - disable_work_sync(&channel->bh_work); - - /* now request memdma channel goes idle */ - idlereq = (1 << channel->tsin_id) | IDLEREQ; - writel(idlereq, fei->io + DMA_IDLE_REQ); - - /* wait for idle irq handler to signal completion */ - ret = wait_for_completion_timeout(&channel->idle_completion, - msecs_to_jiffies(100)); - - if (ret == 0) - dev_warn(fei->dev, - "Timeout waiting for idle irq on tsin%d\n", - channel->tsin_id); - - reinit_completion(&channel->idle_completion); - - /* reset read / write ptrs for this channel */ - - writel(channel->back_buffer_busaddr, - channel->irec + DMA_PRDS_BUSBASE_TP(0)); - - tmp = channel->back_buffer_busaddr + FEI_BUFFER_SIZE - 1; - writel(tmp, channel->irec + DMA_PRDS_BUSTOP_TP(0)); - - writel(channel->back_buffer_busaddr, - channel->irec + DMA_PRDS_BUSWP_TP(0)); - - dev_dbg(fei->dev, - "%s:%d stopping DMA feed on stdemux=%p channel=%d\n", - __func__, __LINE__, stdemux, channel->tsin_id); - - /* turn off all PIDS in the bitmap */ - memset(channel->pid_buffer_aligned, 0, PID_TABLE_SIZE); - - /* manage cache so data is visible to HW */ - dma_sync_single_for_device(fei->dev, - channel->pid_buffer_busaddr, - PID_TABLE_SIZE, - DMA_TO_DEVICE); - - channel->active = 0; - } - - if (--fei->global_feed_count == 0) { - dev_dbg(fei->dev, "%s:%d global_feed_count=%d\n" - , __func__, __LINE__, fei->global_feed_count); - - timer_delete(&fei->timer); - } - - mutex_unlock(&fei->lock); - - return 0; -} - -static struct channel_info *find_channel(struct c8sectpfei *fei, int tsin_num) -{ - int i; - - for (i = 0; i < C8SECTPFE_MAX_TSIN_CHAN; i++) { - if (!fei->channel_data[i]) - continue; - - if (fei->channel_data[i]->tsin_id == tsin_num) - return fei->channel_data[i]; - } - - return NULL; -} - -static void c8sectpfe_getconfig(struct c8sectpfei *fei) -{ - struct c8sectpfe_hw *hw = &fei->hw_stats; - - hw->num_ib = readl(fei->io + SYS_CFG_NUM_IB); - hw->num_mib = readl(fei->io + SYS_CFG_NUM_MIB); - hw->num_swts = readl(fei->io + SYS_CFG_NUM_SWTS); - hw->num_tsout = readl(fei->io + SYS_CFG_NUM_TSOUT); - hw->num_ccsc = readl(fei->io + SYS_CFG_NUM_CCSC); - hw->num_ram = readl(fei->io + SYS_CFG_NUM_RAM); - hw->num_tp = readl(fei->io + SYS_CFG_NUM_TP); - - dev_info(fei->dev, "C8SECTPFE hw supports the following:\n"); - dev_info(fei->dev, "Input Blocks: %d\n", hw->num_ib); - dev_info(fei->dev, "Merged Input Blocks: %d\n", hw->num_mib); - dev_info(fei->dev, "Software Transport Stream Inputs: %d\n" - , hw->num_swts); - dev_info(fei->dev, "Transport Stream Output: %d\n", hw->num_tsout); - dev_info(fei->dev, "Cable Card Converter: %d\n", hw->num_ccsc); - dev_info(fei->dev, "RAMs supported by C8SECTPFE: %d\n", hw->num_ram); - dev_info(fei->dev, "Tango TPs supported by C8SECTPFE: %d\n" - , hw->num_tp); -} - -static irqreturn_t c8sectpfe_idle_irq_handler(int irq, void *priv) -{ - struct c8sectpfei *fei = priv; - struct channel_info *chan; - int bit; - unsigned long tmp = readl(fei->io + DMA_IDLE_REQ); - - /* page 168 of functional spec: Clear the idle request - by writing 0 to the C8SECTPFE_DMA_IDLE_REQ register. */ - - /* signal idle completion */ - for_each_set_bit(bit, &tmp, fei->hw_stats.num_ib) { - - chan = find_channel(fei, bit); - - if (chan) - complete(&chan->idle_completion); - } - - writel(0, fei->io + DMA_IDLE_REQ); - - return IRQ_HANDLED; -} - - -static void free_input_block(struct c8sectpfei *fei, struct channel_info *tsin) -{ - if (!fei || !tsin) - return; - - if (tsin->back_buffer_busaddr) - if (!dma_mapping_error(fei->dev, tsin->back_buffer_busaddr)) - dma_unmap_single(fei->dev, tsin->back_buffer_busaddr, - FEI_BUFFER_SIZE, DMA_BIDIRECTIONAL); - - kfree(tsin->back_buffer_start); - - if (tsin->pid_buffer_busaddr) - if (!dma_mapping_error(fei->dev, tsin->pid_buffer_busaddr)) - dma_unmap_single(fei->dev, tsin->pid_buffer_busaddr, - PID_TABLE_SIZE, DMA_BIDIRECTIONAL); - - kfree(tsin->pid_buffer_start); -} - -#define MAX_NAME 20 - -static int configure_memdma_and_inputblock(struct c8sectpfei *fei, - struct channel_info *tsin) -{ - int ret; - u32 tmp; - char tsin_pin_name[MAX_NAME]; - - if (!fei || !tsin) - return -EINVAL; - - dev_dbg(fei->dev, "%s:%d Configuring channel=%p tsin=%d\n" - , __func__, __LINE__, tsin, tsin->tsin_id); - - init_completion(&tsin->idle_completion); - - tsin->back_buffer_start = kzalloc(FEI_BUFFER_SIZE + FEI_ALIGNMENT, GFP_KERNEL); - if (!tsin->back_buffer_start) { - ret = -ENOMEM; - goto err_unmap; - } - - /* Ensure backbuffer is 32byte aligned */ - tsin->back_buffer_aligned = tsin->back_buffer_start + FEI_ALIGNMENT; - - tsin->back_buffer_aligned = PTR_ALIGN(tsin->back_buffer_aligned, FEI_ALIGNMENT); - - tsin->back_buffer_busaddr = dma_map_single(fei->dev, - tsin->back_buffer_aligned, - FEI_BUFFER_SIZE, - DMA_BIDIRECTIONAL); - - if (dma_mapping_error(fei->dev, tsin->back_buffer_busaddr)) { - dev_err(fei->dev, "failed to map back_buffer\n"); - ret = -EFAULT; - goto err_unmap; - } - - /* - * The pid buffer can be configured (in hw) for byte or bit - * per pid. By powers of deduction we conclude stih407 family - * is configured (at SoC design stage) for bit per pid. - */ - tsin->pid_buffer_start = kzalloc(PID_TABLE_SIZE + PID_TABLE_SIZE, GFP_KERNEL); - if (!tsin->pid_buffer_start) { - ret = -ENOMEM; - goto err_unmap; - } - - /* - * PID buffer needs to be aligned to size of the pid table - * which at bit per pid is 1024 bytes (8192 pids / 8). - * PIDF_BASE register enforces this alignment when writing - * the register. - */ - - tsin->pid_buffer_aligned = tsin->pid_buffer_start + PID_TABLE_SIZE; - - tsin->pid_buffer_aligned = PTR_ALIGN(tsin->pid_buffer_aligned, PID_TABLE_SIZE); - - tsin->pid_buffer_busaddr = dma_map_single(fei->dev, - tsin->pid_buffer_aligned, - PID_TABLE_SIZE, - DMA_BIDIRECTIONAL); - - if (dma_mapping_error(fei->dev, tsin->pid_buffer_busaddr)) { - dev_err(fei->dev, "failed to map pid_bitmap\n"); - ret = -EFAULT; - goto err_unmap; - } - - /* manage cache so pid bitmap is visible to HW */ - dma_sync_single_for_device(fei->dev, - tsin->pid_buffer_busaddr, - PID_TABLE_SIZE, - DMA_TO_DEVICE); - - snprintf(tsin_pin_name, MAX_NAME, "tsin%d-%s", tsin->tsin_id, - (tsin->serial_not_parallel ? "serial" : "parallel")); - - tsin->pstate = pinctrl_lookup_state(fei->pinctrl, tsin_pin_name); - if (IS_ERR(tsin->pstate)) { - dev_err(fei->dev, "%s: pinctrl_lookup_state couldn't find %s state\n" - , __func__, tsin_pin_name); - ret = PTR_ERR(tsin->pstate); - goto err_unmap; - } - - ret = pinctrl_select_state(fei->pinctrl, tsin->pstate); - - if (ret) { - dev_err(fei->dev, "%s: pinctrl_select_state failed\n" - , __func__); - goto err_unmap; - } - - /* Enable this input block */ - tmp = readl(fei->io + SYS_INPUT_CLKEN); - tmp |= BIT(tsin->tsin_id); - writel(tmp, fei->io + SYS_INPUT_CLKEN); - - if (tsin->serial_not_parallel) - tmp |= C8SECTPFE_SERIAL_NOT_PARALLEL; - - if (tsin->invert_ts_clk) - tmp |= C8SECTPFE_INVERT_TSCLK; - - if (tsin->async_not_sync) - tmp |= C8SECTPFE_ASYNC_NOT_SYNC; - - tmp |= C8SECTPFE_ALIGN_BYTE_SOP | C8SECTPFE_BYTE_ENDIANNESS_MSB; - - writel(tmp, fei->io + C8SECTPFE_IB_IP_FMT_CFG(tsin->tsin_id)); - - writel(C8SECTPFE_SYNC(0x9) | - C8SECTPFE_DROP(0x9) | - C8SECTPFE_TOKEN(0x47), - fei->io + C8SECTPFE_IB_SYNCLCKDRP_CFG(tsin->tsin_id)); - - writel(TS_PKT_SIZE, fei->io + C8SECTPFE_IB_PKT_LEN(tsin->tsin_id)); - - /* Place the FIFO's at the end of the irec descriptors */ - - tsin->fifo = (tsin->tsin_id * FIFO_LEN); - - writel(tsin->fifo, fei->io + C8SECTPFE_IB_BUFF_STRT(tsin->tsin_id)); - writel(tsin->fifo + FIFO_LEN - 1, - fei->io + C8SECTPFE_IB_BUFF_END(tsin->tsin_id)); - - writel(tsin->fifo, fei->io + C8SECTPFE_IB_READ_PNT(tsin->tsin_id)); - writel(tsin->fifo, fei->io + C8SECTPFE_IB_WRT_PNT(tsin->tsin_id)); - - writel(tsin->pid_buffer_busaddr, - fei->io + PIDF_BASE(tsin->tsin_id)); - - dev_dbg(fei->dev, "chan=%d PIDF_BASE=0x%x pid_bus_addr=%pad\n", - tsin->tsin_id, readl(fei->io + PIDF_BASE(tsin->tsin_id)), - &tsin->pid_buffer_busaddr); - - /* Configure and enable HW PID filtering */ - - /* - * The PID value is created by assembling the first 8 bytes of - * the TS packet into a 64-bit word in big-endian format. A - * slice of that 64-bit word is taken from - * (PID_OFFSET+PID_NUM_BITS-1) to PID_OFFSET. - */ - tmp = (C8SECTPFE_PID_ENABLE | C8SECTPFE_PID_NUMBITS(13) - | C8SECTPFE_PID_OFFSET(40)); - - writel(tmp, fei->io + C8SECTPFE_IB_PID_SET(tsin->tsin_id)); - - dev_dbg(fei->dev, "chan=%d setting wp: %d, rp: %d, buf: %d-%d\n", - tsin->tsin_id, - readl(fei->io + C8SECTPFE_IB_WRT_PNT(tsin->tsin_id)), - readl(fei->io + C8SECTPFE_IB_READ_PNT(tsin->tsin_id)), - readl(fei->io + C8SECTPFE_IB_BUFF_STRT(tsin->tsin_id)), - readl(fei->io + C8SECTPFE_IB_BUFF_END(tsin->tsin_id))); - - /* Get base addpress of pointer record block from DMEM */ - tsin->irec = fei->io + DMA_MEMDMA_OFFSET + DMA_DMEM_OFFSET + - readl(fei->io + DMA_PTRREC_BASE); - - /* fill out pointer record data structure */ - - /* advance pointer record block to our channel */ - tsin->irec += (tsin->tsin_id * DMA_PRDS_SIZE); - - writel(tsin->fifo, tsin->irec + DMA_PRDS_MEMBASE); - - writel(tsin->fifo + FIFO_LEN - 1, tsin->irec + DMA_PRDS_MEMTOP); - - writel((188 + 7)&~7, tsin->irec + DMA_PRDS_PKTSIZE); - - writel(0x1, tsin->irec + DMA_PRDS_TPENABLE); - - /* read/write pointers with physical bus address */ - - writel(tsin->back_buffer_busaddr, tsin->irec + DMA_PRDS_BUSBASE_TP(0)); - - tmp = tsin->back_buffer_busaddr + FEI_BUFFER_SIZE - 1; - writel(tmp, tsin->irec + DMA_PRDS_BUSTOP_TP(0)); - - writel(tsin->back_buffer_busaddr, tsin->irec + DMA_PRDS_BUSWP_TP(0)); - writel(tsin->back_buffer_busaddr, tsin->irec + DMA_PRDS_BUSRP_TP(0)); - - /* initialize bh work */ - INIT_WORK(&tsin->bh_work, channel_swdemux_bh_work); - - return 0; - -err_unmap: - free_input_block(fei, tsin); - return ret; -} - -static irqreturn_t c8sectpfe_error_irq_handler(int irq, void *priv) -{ - struct c8sectpfei *fei = priv; - - dev_err(fei->dev, "%s: error handling not yet implemented\n" - , __func__); - - /* - * TODO FIXME we should detect some error conditions here - * and ideally do something about them! - */ - - return IRQ_HANDLED; -} - -static int c8sectpfe_probe(struct platform_device *pdev) -{ - struct device *dev = &pdev->dev; - struct device_node *np = dev->of_node; - struct c8sectpfei *fei; - struct resource *res; - int ret, index = 0; - struct channel_info *tsin; - - /* Allocate the c8sectpfei structure */ - fei = devm_kzalloc(dev, sizeof(struct c8sectpfei), GFP_KERNEL); - if (!fei) - return -ENOMEM; - - fei->dev = dev; - - res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "c8sectpfe"); - fei->io = devm_ioremap_resource(dev, res); - if (IS_ERR(fei->io)) - return PTR_ERR(fei->io); - - res = platform_get_resource_byname(pdev, IORESOURCE_MEM, - "c8sectpfe-ram"); - fei->sram = devm_ioremap_resource(dev, res); - if (IS_ERR(fei->sram)) - return PTR_ERR(fei->sram); - - fei->sram_size = resource_size(res); - - fei->idle_irq = platform_get_irq_byname(pdev, "c8sectpfe-idle-irq"); - if (fei->idle_irq < 0) - return fei->idle_irq; - - fei->error_irq = platform_get_irq_byname(pdev, "c8sectpfe-error-irq"); - if (fei->error_irq < 0) - return fei->error_irq; - - platform_set_drvdata(pdev, fei); - - fei->c8sectpfeclk = devm_clk_get_enabled(dev, "c8sectpfe"); - if (IS_ERR(fei->c8sectpfeclk)) { - dev_err(dev, "Failed to enable c8sectpfe clock\n"); - return PTR_ERR(fei->c8sectpfeclk); - } - - /* to save power disable all IP's (on by default) */ - writel(0, fei->io + SYS_INPUT_CLKEN); - - /* Enable memdma clock */ - writel(MEMDMAENABLE, fei->io + SYS_OTHER_CLKEN); - - /* clear internal sram */ - memset_io(fei->sram, 0x0, fei->sram_size); - - c8sectpfe_getconfig(fei); - - ret = devm_request_irq(dev, fei->idle_irq, c8sectpfe_idle_irq_handler, - 0, "c8sectpfe-idle-irq", fei); - if (ret) { - dev_err(dev, "Can't register c8sectpfe-idle-irq IRQ.\n"); - return ret; - } - - ret = devm_request_irq(dev, fei->error_irq, - c8sectpfe_error_irq_handler, 0, - "c8sectpfe-error-irq", fei); - if (ret) { - dev_err(dev, "Can't register c8sectpfe-error-irq IRQ.\n"); - return ret; - } - - fei->tsin_count = of_get_child_count(np); - - if (fei->tsin_count > C8SECTPFE_MAX_TSIN_CHAN || - fei->tsin_count > fei->hw_stats.num_ib) { - - dev_err(dev, "More tsin declared than exist on SoC!\n"); - return -EINVAL; - } - - fei->pinctrl = devm_pinctrl_get(dev); - - if (IS_ERR(fei->pinctrl)) { - dev_err(dev, "Error getting tsin pins\n"); - return PTR_ERR(fei->pinctrl); - } - - for_each_child_of_node_scoped(np, child) { - struct device_node *i2c_bus; - - fei->channel_data[index] = devm_kzalloc(dev, - sizeof(struct channel_info), - GFP_KERNEL); - - if (!fei->channel_data[index]) - return -ENOMEM; - - tsin = fei->channel_data[index]; - - tsin->fei = fei; - - ret = of_property_read_u32(child, "tsin-num", &tsin->tsin_id); - if (ret) { - dev_err(&pdev->dev, "No tsin_num found\n"); - return ret; - } - - /* sanity check value */ - if (tsin->tsin_id > fei->hw_stats.num_ib) { - dev_err(&pdev->dev, - "tsin-num %d specified greater than number\n\tof input block hw in SoC! (%d)", - tsin->tsin_id, fei->hw_stats.num_ib); - return -EINVAL; - } - - tsin->invert_ts_clk = of_property_read_bool(child, - "invert-ts-clk"); - - tsin->serial_not_parallel = of_property_read_bool(child, - "serial-not-parallel"); - - tsin->async_not_sync = of_property_read_bool(child, - "async-not-sync"); - - ret = of_property_read_u32(child, "dvb-card", - &tsin->dvb_card); - if (ret) { - dev_err(&pdev->dev, "No dvb-card found\n"); - return ret; - } - - i2c_bus = of_parse_phandle(child, "i2c-bus", 0); - if (!i2c_bus) { - dev_err(&pdev->dev, "No i2c-bus found\n"); - return -ENODEV; - } - tsin->i2c_adapter = - of_find_i2c_adapter_by_node(i2c_bus); - of_node_put(i2c_bus); - if (!tsin->i2c_adapter) { - dev_err(&pdev->dev, "No i2c adapter found\n"); - return -ENODEV; - } - - /* Acquire reset GPIO and activate it */ - tsin->rst_gpio = devm_fwnode_gpiod_get(dev, - of_fwnode_handle(child), - "reset", GPIOD_OUT_HIGH, - "NIM reset"); - ret = PTR_ERR_OR_ZERO(tsin->rst_gpio); - if (ret && ret != -EBUSY) { - dev_err(dev, "Can't request tsin%d reset gpio\n", - fei->channel_data[index]->tsin_id); - return ret; - } - - if (!ret) { - /* wait for the chip to reset */ - usleep_range(3500, 5000); - /* release the reset line */ - gpiod_set_value_cansleep(tsin->rst_gpio, 0); - usleep_range(3000, 5000); - } - - tsin->demux_mapping = index; - - dev_dbg(fei->dev, - "channel=%p n=%d tsin_num=%d, invert-ts-clk=%d\n\tserial-not-parallel=%d pkt-clk-valid=%d dvb-card=%d\n", - fei->channel_data[index], index, - tsin->tsin_id, tsin->invert_ts_clk, - tsin->serial_not_parallel, tsin->async_not_sync, - tsin->dvb_card); - - index++; - } - - /* Setup timer interrupt */ - timer_setup(&fei->timer, c8sectpfe_timer_interrupt, 0); - - mutex_init(&fei->lock); - - /* Get the configuration information about the tuners */ - ret = c8sectpfe_tuner_register_frontend(&fei->c8sectpfe[0], - (void *)fei, - c8sectpfe_start_feed, - c8sectpfe_stop_feed); - if (ret) { - dev_err(dev, "c8sectpfe_tuner_register_frontend failed (%d)\n", - ret); - return ret; - } - - c8sectpfe_debugfs_init(fei); - - return 0; -} - -static void c8sectpfe_remove(struct platform_device *pdev) -{ - struct c8sectpfei *fei = platform_get_drvdata(pdev); - struct channel_info *channel; - int i; - - wait_for_completion(&fei->fw_ack); - - c8sectpfe_tuner_unregister_frontend(fei->c8sectpfe[0], fei); - - /* - * Now loop through and un-configure each of the InputBlock resources - */ - for (i = 0; i < fei->tsin_count; i++) { - channel = fei->channel_data[i]; - free_input_block(fei, channel); - } - - c8sectpfe_debugfs_exit(fei); - - dev_info(fei->dev, "Stopping memdma SLIM core\n"); - if (readl(fei->io + DMA_CPU_RUN)) - writel(0x0, fei->io + DMA_CPU_RUN); - - /* unclock all internal IP's */ - if (readl(fei->io + SYS_INPUT_CLKEN)) - writel(0, fei->io + SYS_INPUT_CLKEN); - - if (readl(fei->io + SYS_OTHER_CLKEN)) - writel(0, fei->io + SYS_OTHER_CLKEN); -} - - -static int configure_channels(struct c8sectpfei *fei) -{ - int index = 0, ret; - struct device_node *np = fei->dev->of_node; - - /* iterate round each tsin and configure memdma descriptor and IB hw */ - for_each_child_of_node_scoped(np, child) { - ret = configure_memdma_and_inputblock(fei, - fei->channel_data[index]); - if (ret) { - dev_err(fei->dev, - "configure_memdma_and_inputblock failed\n"); - goto err_unmap; - } - index++; - } - - return 0; - -err_unmap: - while (--index >= 0) - free_input_block(fei, fei->channel_data[index]); - - return ret; -} - -static int -c8sectpfe_elf_sanity_check(struct c8sectpfei *fei, const struct firmware *fw) -{ - struct elf32_hdr *ehdr; - char class; - - if (!fw) { - dev_err(fei->dev, "failed to load %s\n", FIRMWARE_MEMDMA); - return -EINVAL; - } - - if (fw->size < sizeof(struct elf32_hdr)) { - dev_err(fei->dev, "Image is too small\n"); - return -EINVAL; - } - - ehdr = (struct elf32_hdr *)fw->data; - - /* We only support ELF32 at this point */ - class = ehdr->e_ident[EI_CLASS]; - if (class != ELFCLASS32) { - dev_err(fei->dev, "Unsupported class: %d\n", class); - return -EINVAL; - } - - if (ehdr->e_ident[EI_DATA] != ELFDATA2LSB) { - dev_err(fei->dev, "Unsupported firmware endianness\n"); - return -EINVAL; - } - - if (fw->size < ehdr->e_shoff + sizeof(struct elf32_shdr)) { - dev_err(fei->dev, "Image is too small\n"); - return -EINVAL; - } - - if (memcmp(ehdr->e_ident, ELFMAG, SELFMAG)) { - dev_err(fei->dev, "Image is corrupted (bad magic)\n"); - return -EINVAL; - } - - /* Check ELF magic */ - ehdr = (Elf32_Ehdr *)fw->data; - if (ehdr->e_ident[EI_MAG0] != ELFMAG0 || - ehdr->e_ident[EI_MAG1] != ELFMAG1 || - ehdr->e_ident[EI_MAG2] != ELFMAG2 || - ehdr->e_ident[EI_MAG3] != ELFMAG3) { - dev_err(fei->dev, "Invalid ELF magic\n"); - return -EINVAL; - } - - if (ehdr->e_type != ET_EXEC) { - dev_err(fei->dev, "Unsupported ELF header type\n"); - return -EINVAL; - } - - if (ehdr->e_phoff > fw->size) { - dev_err(fei->dev, "Firmware size is too small\n"); - return -EINVAL; - } - - return 0; -} - - -static void load_imem_segment(struct c8sectpfei *fei, Elf32_Phdr *phdr, - const struct firmware *fw, u8 __iomem *dest, - int seg_num) -{ - const u8 *imem_src = fw->data + phdr->p_offset; - int i; - - /* - * For IMEM segments, the segment contains 24-bit - * instructions which must be padded to 32-bit - * instructions before being written. The written - * segment is padded with NOP instructions. - */ - - dev_dbg(fei->dev, - "Loading IMEM segment %d 0x%08x\n\t (0x%x bytes) -> 0x%p (0x%x bytes)\n", - seg_num, phdr->p_paddr, phdr->p_filesz, dest, - phdr->p_memsz + phdr->p_memsz / 3); - - for (i = 0; i < phdr->p_filesz; i++) { - - writeb(readb((void __iomem *)imem_src), (void __iomem *)dest); - - /* Every 3 bytes, add an additional - * padding zero in destination */ - if (i % 3 == 2) { - dest++; - writeb(0x00, (void __iomem *)dest); - } - - dest++; - imem_src++; - } -} - -static void load_dmem_segment(struct c8sectpfei *fei, Elf32_Phdr *phdr, - const struct firmware *fw, u8 __iomem *dst, int seg_num) -{ - /* - * For DMEM segments copy the segment data from the ELF - * file and pad segment with zeroes - */ - - dev_dbg(fei->dev, - "Loading DMEM segment %d 0x%08x\n\t(0x%x bytes) -> 0x%p (0x%x bytes)\n", - seg_num, phdr->p_paddr, phdr->p_filesz, - dst, phdr->p_memsz); - - memcpy((void __force *)dst, (void *)fw->data + phdr->p_offset, - phdr->p_filesz); - - memset((void __force *)dst + phdr->p_filesz, 0, - phdr->p_memsz - phdr->p_filesz); -} - -static int load_slim_core_fw(const struct firmware *fw, struct c8sectpfei *fei) -{ - Elf32_Ehdr *ehdr; - Elf32_Phdr *phdr; - u8 __iomem *dst; - int err = 0, i; - - if (!fw || !fei) - return -EINVAL; - - ehdr = (Elf32_Ehdr *)fw->data; - phdr = (Elf32_Phdr *)(fw->data + ehdr->e_phoff); - - /* go through the available ELF segments */ - for (i = 0; i < ehdr->e_phnum; i++, phdr++) { - - /* Only consider LOAD segments */ - if (phdr->p_type != PT_LOAD) - continue; - - /* - * Check segment is contained within the fw->data buffer - */ - if (phdr->p_offset + phdr->p_filesz > fw->size) { - dev_err(fei->dev, - "Segment %d is outside of firmware file\n", i); - err = -EINVAL; - break; - } - - /* - * MEMDMA IMEM has executable flag set, otherwise load - * this segment into DMEM. - * - */ - - if (phdr->p_flags & PF_X) { - dst = (u8 __iomem *) fei->io + DMA_MEMDMA_IMEM; - /* - * The Slim ELF file uses 32-bit word addressing for - * load offsets. - */ - dst += (phdr->p_paddr & 0xFFFFF) * sizeof(unsigned int); - load_imem_segment(fei, phdr, fw, dst, i); - } else { - dst = (u8 __iomem *) fei->io + DMA_MEMDMA_DMEM; - /* - * The Slim ELF file uses 32-bit word addressing for - * load offsets. - */ - dst += (phdr->p_paddr & 0xFFFFF) * sizeof(unsigned int); - load_dmem_segment(fei, phdr, fw, dst, i); - } - } - - return err; -} - -static int load_c8sectpfe_fw(struct c8sectpfei *fei) -{ - const struct firmware *fw; - int err; - - dev_info(fei->dev, "Loading firmware: %s\n", FIRMWARE_MEMDMA); - - err = request_firmware(&fw, FIRMWARE_MEMDMA, fei->dev); - if (err) - return err; - - err = c8sectpfe_elf_sanity_check(fei, fw); - if (err) { - dev_err(fei->dev, "c8sectpfe_elf_sanity_check failed err=(%d)\n" - , err); - release_firmware(fw); - return err; - } - - err = load_slim_core_fw(fw, fei); - release_firmware(fw); - if (err) { - dev_err(fei->dev, "load_slim_core_fw failed err=(%d)\n", err); - return err; - } - - /* now the firmware is loaded configure the input blocks */ - err = configure_channels(fei); - if (err) { - dev_err(fei->dev, "configure_channels failed err=(%d)\n", err); - return err; - } - - /* - * STBus target port can access IMEM and DMEM ports - * without waiting for CPU - */ - writel(0x1, fei->io + DMA_PER_STBUS_SYNC); - - dev_info(fei->dev, "Boot the memdma SLIM core\n"); - writel(0x1, fei->io + DMA_CPU_RUN); - - atomic_set(&fei->fw_loaded, 1); - - return 0; -} - -static const struct of_device_id c8sectpfe_match[] = { - { .compatible = "st,stih407-c8sectpfe" }, - { /* sentinel */ }, -}; -MODULE_DEVICE_TABLE(of, c8sectpfe_match); - -static struct platform_driver c8sectpfe_driver = { - .driver = { - .name = "c8sectpfe", - .of_match_table = c8sectpfe_match, - }, - .probe = c8sectpfe_probe, - .remove = c8sectpfe_remove, -}; - -module_platform_driver(c8sectpfe_driver); - -MODULE_AUTHOR("Peter Bennett <peter.bennett@st.com>"); -MODULE_AUTHOR("Peter Griffin <peter.griffin@linaro.org>"); -MODULE_DESCRIPTION("C8SECTPFE STi DVB Driver"); -MODULE_LICENSE("GPL"); diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.h b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.h deleted file mode 100644 index c1b124c6ef128a6fe3fd5cbe5f5f3aee1b034af1..0000000000000000000000000000000000000000 --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.h +++ /dev/null @@ -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_ */ diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-debugfs.c b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-debugfs.c deleted file mode 100644 index 301fa10f419b6a7c9a1b50d759fd0fbbfc0f7692..0000000000000000000000000000000000000000 --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-debugfs.c +++ /dev/null @@ -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; -} diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-debugfs.h b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-debugfs.h deleted file mode 100644 index 3fe177b59b16d2789cde2438367d6f4cbfd9c832..0000000000000000000000000000000000000000 --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-debugfs.h +++ /dev/null @@ -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 */ diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-dvb.c b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-dvb.c deleted file mode 100644 index feb48cb546d7f11efb62339b8389187f5cec43c9..0000000000000000000000000000000000000000 --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-dvb.c +++ /dev/null @@ -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; -} diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-dvb.h b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-dvb.h deleted file mode 100644 index 3d87a9ae8702d40629a8aa0a0ee76ddf1ad815b8..0000000000000000000000000000000000000000 --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-dvb.h +++ /dev/null @@ -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 -- 2.51.0 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH v2 1/5] media: c8sectpfe: remove support of STi c8sectpfe driver 2025-09-12 11:36 ` [PATCH v2 1/5] media: c8sectpfe: remove support of STi c8sectpfe driver Raphael Gallais-Pou @ 2025-09-12 14:24 ` Patrice CHOTARD 0 siblings, 0 replies; 18+ messages in thread From: Patrice CHOTARD @ 2025-09-12 14:24 UTC (permalink / raw) To: Raphael Gallais-Pou, Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Michael Turquette, Stephen Boyd Cc: linux-kernel, linux-media, devicetree, linux-clk On 9/12/25 13:36, Raphael Gallais-Pou wrote: > STi c8sectpfe device is only used on B2120 boards, which support has > been withdrawn in commit dee546e1adef ("ARM: sti: drop B2120 board > support"). > > Signed-off-by: Raphael Gallais-Pou <rgallaispou@gmail.com> > --- > MAINTAINERS | 1 - > drivers/media/platform/st/Makefile | 1 - > drivers/media/platform/st/sti/Kconfig | 1 - > drivers/media/platform/st/sti/Makefile | 1 - > drivers/media/platform/st/sti/c8sectpfe/Kconfig | 28 - > drivers/media/platform/st/sti/c8sectpfe/Makefile | 11 - > .../platform/st/sti/c8sectpfe/c8sectpfe-common.c | 262 ----- > .../platform/st/sti/c8sectpfe/c8sectpfe-common.h | 60 - > .../platform/st/sti/c8sectpfe/c8sectpfe-core.c | 1158 -------------------- > .../platform/st/sti/c8sectpfe/c8sectpfe-core.h | 287 ----- > .../platform/st/sti/c8sectpfe/c8sectpfe-debugfs.c | 244 ----- > .../platform/st/sti/c8sectpfe/c8sectpfe-debugfs.h | 23 - > .../platform/st/sti/c8sectpfe/c8sectpfe-dvb.c | 235 ---- > .../platform/st/sti/c8sectpfe/c8sectpfe-dvb.h | 17 - > 14 files changed, 2329 deletions(-) > > diff --git a/MAINTAINERS b/MAINTAINERS > index 7b7396ed28a700a2aab318553ce8ba1788312bff..ed5bc86ec5638ed6e0635b8ce0120f8f27435ff0 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -3413,7 +3413,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 > diff --git a/drivers/media/platform/st/Makefile b/drivers/media/platform/st/Makefile > index a1f75b2a822583c931f2696e3fffd7981d87917b..615a93d62662105c51af076345da7f3bdc86227c 100644 > --- a/drivers/media/platform/st/Makefile > +++ b/drivers/media/platform/st/Makefile > @@ -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/ > diff --git a/drivers/media/platform/st/sti/Kconfig b/drivers/media/platform/st/sti/Kconfig > index 60068e8b47b8651e0c2e64121441faef9061933c..91ca0950ff7308d9414d75bfbb2a0e815e7a2104 100644 > --- a/drivers/media/platform/st/sti/Kconfig > +++ b/drivers/media/platform/st/sti/Kconfig > @@ -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" > diff --git a/drivers/media/platform/st/sti/Makefile b/drivers/media/platform/st/sti/Makefile > index f9ce8169b0404cef2a7de8f1c7377f8abe511829..3328d50fb6cf2ed2daae2c0640a6596fdd140be5 100644 > --- a/drivers/media/platform/st/sti/Makefile > +++ b/drivers/media/platform/st/sti/Makefile > @@ -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/ > diff --git a/drivers/media/platform/st/sti/c8sectpfe/Kconfig b/drivers/media/platform/st/sti/c8sectpfe/Kconfig > deleted file mode 100644 > index 01c33d9c9ec37ddc9dfc94991e2e9d3b720111e7..0000000000000000000000000000000000000000 > --- a/drivers/media/platform/st/sti/c8sectpfe/Kconfig > +++ /dev/null > @@ -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. > diff --git a/drivers/media/platform/st/sti/c8sectpfe/Makefile b/drivers/media/platform/st/sti/c8sectpfe/Makefile > deleted file mode 100644 > index 99425137ee0a9e48b997d62215d4378075024c69..0000000000000000000000000000000000000000 > --- a/drivers/media/platform/st/sti/c8sectpfe/Makefile > +++ /dev/null > @@ -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/ > diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-common.c b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-common.c > deleted file mode 100644 > index 5df67da25525cbfec8b5890fdd626f634408a6f0..0000000000000000000000000000000000000000 > --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-common.c > +++ /dev/null > @@ -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; > -} > diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-common.h b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-common.h > deleted file mode 100644 > index f8d97841f366e32d1087d135bdda8edbb14c1399..0000000000000000000000000000000000000000 > --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-common.h > +++ /dev/null > @@ -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 > diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.c b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.c > deleted file mode 100644 > index 89bd15a4d26a95be5576ba5f666fa20f4d010728..0000000000000000000000000000000000000000 > --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.c > +++ /dev/null > @@ -1,1158 +0,0 @@ > -// SPDX-License-Identifier: GPL-2.0 > -/* > - * c8sectpfe-core.c - C8SECTPFE STi DVB driver > - * > - * Copyright (c) STMicroelectronics 2015 > - * > - * Author:Peter Bennett <peter.bennett@st.com> > - * Peter Griffin <peter.griffin@linaro.org> > - * > - */ > -#include <linux/atomic.h> > -#include <linux/clk.h> > -#include <linux/completion.h> > -#include <linux/delay.h> > -#include <linux/device.h> > -#include <linux/dma-mapping.h> > -#include <linux/dvb/dmx.h> > -#include <linux/dvb/frontend.h> > -#include <linux/err.h> > -#include <linux/errno.h> > -#include <linux/firmware.h> > -#include <linux/gpio/consumer.h> > -#include <linux/init.h> > -#include <linux/interrupt.h> > -#include <linux/io.h> > -#include <linux/module.h> > -#include <linux/of_platform.h> > -#include <linux/pinctrl/consumer.h> > -#include <linux/pinctrl/pinctrl.h> > -#include <linux/platform_device.h> > -#include <linux/slab.h> > -#include <linux/time.h> > -#include <linux/usb.h> > -#include <linux/wait.h> > - > -#include "c8sectpfe-common.h" > -#include "c8sectpfe-core.h" > -#include "c8sectpfe-debugfs.h" > - > -#include <media/dmxdev.h> > -#include <media/dvb_demux.h> > -#include <media/dvb_frontend.h> > -#include <media/dvb_net.h> > - > -#define FIRMWARE_MEMDMA "pti_memdma_h407.elf" > -MODULE_FIRMWARE(FIRMWARE_MEMDMA); > - > -#define PID_TABLE_SIZE 1024 > -#define POLL_MSECS 50 > - > -static int load_c8sectpfe_fw(struct c8sectpfei *fei); > - > -#define TS_PKT_SIZE 188 > -#define HEADER_SIZE (4) > -#define PACKET_SIZE (TS_PKT_SIZE+HEADER_SIZE) > - > -#define FEI_ALIGNMENT (32) > -/* hw requires minimum of 8*PACKET_SIZE and padded to 8byte boundary */ > -#define FEI_BUFFER_SIZE (8*PACKET_SIZE*340) > - > -#define FIFO_LEN 1024 > - > -static void c8sectpfe_timer_interrupt(struct timer_list *t) > -{ > - struct c8sectpfei *fei = timer_container_of(fei, t, timer); > - struct channel_info *channel; > - int chan_num; > - > - /* iterate through input block channels */ > - for (chan_num = 0; chan_num < fei->tsin_count; chan_num++) { > - channel = fei->channel_data[chan_num]; > - > - /* is this descriptor initialised and TP enabled */ > - if (channel->irec && readl(channel->irec + DMA_PRDS_TPENABLE)) > - queue_work(system_bh_wq, &channel->bh_work); > - } > - > - fei->timer.expires = jiffies + msecs_to_jiffies(POLL_MSECS); > - add_timer(&fei->timer); > -} > - > -static void channel_swdemux_bh_work(struct work_struct *t) > -{ > - struct channel_info *channel = from_work(channel, t, bh_work); > - struct c8sectpfei *fei; > - unsigned long wp, rp; > - int pos, num_packets, n, size; > - u8 *buf; > - > - if (unlikely(!channel || !channel->irec)) > - return; > - > - fei = channel->fei; > - > - wp = readl(channel->irec + DMA_PRDS_BUSWP_TP(0)); > - rp = readl(channel->irec + DMA_PRDS_BUSRP_TP(0)); > - > - pos = rp - channel->back_buffer_busaddr; > - > - /* has it wrapped */ > - if (wp < rp) > - wp = channel->back_buffer_busaddr + FEI_BUFFER_SIZE; > - > - size = wp - rp; > - num_packets = size / PACKET_SIZE; > - > - /* manage cache so data is visible to CPU */ > - dma_sync_single_for_cpu(fei->dev, > - rp, > - size, > - DMA_FROM_DEVICE); > - > - buf = channel->back_buffer_aligned; > - > - dev_dbg(fei->dev, > - "chan=%d channel=%p num_packets = %d, buf = %p, pos = 0x%x\n\trp=0x%lx, wp=0x%lx\n", > - channel->tsin_id, channel, num_packets, buf, pos, rp, wp); > - > - for (n = 0; n < num_packets; n++) { > - dvb_dmx_swfilter_packets( > - &fei->c8sectpfe[0]-> > - demux[channel->demux_mapping].dvb_demux, > - &buf[pos], 1); > - > - pos += PACKET_SIZE; > - } > - > - /* advance the read pointer */ > - if (wp == (channel->back_buffer_busaddr + FEI_BUFFER_SIZE)) > - writel(channel->back_buffer_busaddr, channel->irec + > - DMA_PRDS_BUSRP_TP(0)); > - else > - writel(wp, channel->irec + DMA_PRDS_BUSRP_TP(0)); > -} > - > -static int c8sectpfe_start_feed(struct dvb_demux_feed *dvbdmxfeed) > -{ > - struct dvb_demux *demux = dvbdmxfeed->demux; > - struct stdemux *stdemux = demux->priv; > - struct c8sectpfei *fei = stdemux->c8sectpfei; > - struct channel_info *channel; > - u32 tmp; > - unsigned long *bitmap; > - int ret; > - > - switch (dvbdmxfeed->type) { > - case DMX_TYPE_TS: > - break; > - case DMX_TYPE_SEC: > - break; > - default: > - dev_err(fei->dev, "%s:%d Error bailing\n" > - , __func__, __LINE__); > - return -EINVAL; > - } > - > - if (dvbdmxfeed->type == DMX_TYPE_TS) { > - switch (dvbdmxfeed->pes_type) { > - case DMX_PES_VIDEO: > - case DMX_PES_AUDIO: > - case DMX_PES_TELETEXT: > - case DMX_PES_PCR: > - case DMX_PES_OTHER: > - break; > - default: > - dev_err(fei->dev, "%s:%d Error bailing\n" > - , __func__, __LINE__); > - return -EINVAL; > - } > - } > - > - if (!atomic_read(&fei->fw_loaded)) { > - ret = load_c8sectpfe_fw(fei); > - if (ret) > - return ret; > - } > - > - mutex_lock(&fei->lock); > - > - channel = fei->channel_data[stdemux->tsin_index]; > - > - bitmap = channel->pid_buffer_aligned; > - > - /* 8192 is a special PID */ > - if (dvbdmxfeed->pid == 8192) { > - tmp = readl(fei->io + C8SECTPFE_IB_PID_SET(channel->tsin_id)); > - tmp &= ~C8SECTPFE_PID_ENABLE; > - writel(tmp, fei->io + C8SECTPFE_IB_PID_SET(channel->tsin_id)); > - > - } else { > - bitmap_set(bitmap, dvbdmxfeed->pid, 1); > - } > - > - /* manage cache so PID bitmap is visible to HW */ > - dma_sync_single_for_device(fei->dev, > - channel->pid_buffer_busaddr, > - PID_TABLE_SIZE, > - DMA_TO_DEVICE); > - > - channel->active = 1; > - > - if (fei->global_feed_count == 0) { > - fei->timer.expires = jiffies + > - msecs_to_jiffies(msecs_to_jiffies(POLL_MSECS)); > - > - add_timer(&fei->timer); > - } > - > - if (stdemux->running_feed_count == 0) { > - > - dev_dbg(fei->dev, "Starting channel=%p\n", channel); > - > - INIT_WORK(&channel->bh_work, channel_swdemux_bh_work); > - > - /* Reset the internal inputblock sram pointers */ > - writel(channel->fifo, > - fei->io + C8SECTPFE_IB_BUFF_STRT(channel->tsin_id)); > - writel(channel->fifo + FIFO_LEN - 1, > - fei->io + C8SECTPFE_IB_BUFF_END(channel->tsin_id)); > - > - writel(channel->fifo, > - fei->io + C8SECTPFE_IB_READ_PNT(channel->tsin_id)); > - writel(channel->fifo, > - fei->io + C8SECTPFE_IB_WRT_PNT(channel->tsin_id)); > - > - > - /* reset read / write memdma ptrs for this channel */ > - writel(channel->back_buffer_busaddr, channel->irec + > - DMA_PRDS_BUSBASE_TP(0)); > - > - tmp = channel->back_buffer_busaddr + FEI_BUFFER_SIZE - 1; > - writel(tmp, channel->irec + DMA_PRDS_BUSTOP_TP(0)); > - > - writel(channel->back_buffer_busaddr, channel->irec + > - DMA_PRDS_BUSWP_TP(0)); > - > - /* Issue a reset and enable InputBlock */ > - writel(C8SECTPFE_SYS_ENABLE | C8SECTPFE_SYS_RESET > - , fei->io + C8SECTPFE_IB_SYS(channel->tsin_id)); > - > - /* and enable the tp */ > - writel(0x1, channel->irec + DMA_PRDS_TPENABLE); > - > - dev_dbg(fei->dev, "%s:%d Starting DMA feed on stdemux=%p\n" > - , __func__, __LINE__, stdemux); > - } > - > - stdemux->running_feed_count++; > - fei->global_feed_count++; > - > - mutex_unlock(&fei->lock); > - > - return 0; > -} > - > -static int c8sectpfe_stop_feed(struct dvb_demux_feed *dvbdmxfeed) > -{ > - > - struct dvb_demux *demux = dvbdmxfeed->demux; > - struct stdemux *stdemux = demux->priv; > - struct c8sectpfei *fei = stdemux->c8sectpfei; > - struct channel_info *channel; > - int idlereq; > - u32 tmp; > - int ret; > - unsigned long *bitmap; > - > - if (!atomic_read(&fei->fw_loaded)) { > - ret = load_c8sectpfe_fw(fei); > - if (ret) > - return ret; > - } > - > - mutex_lock(&fei->lock); > - > - channel = fei->channel_data[stdemux->tsin_index]; > - > - bitmap = channel->pid_buffer_aligned; > - > - if (dvbdmxfeed->pid == 8192) { > - tmp = readl(fei->io + C8SECTPFE_IB_PID_SET(channel->tsin_id)); > - tmp |= C8SECTPFE_PID_ENABLE; > - writel(tmp, fei->io + C8SECTPFE_IB_PID_SET(channel->tsin_id)); > - } else { > - bitmap_clear(bitmap, dvbdmxfeed->pid, 1); > - } > - > - /* manage cache so data is visible to HW */ > - dma_sync_single_for_device(fei->dev, > - channel->pid_buffer_busaddr, > - PID_TABLE_SIZE, > - DMA_TO_DEVICE); > - > - if (--stdemux->running_feed_count == 0) { > - > - channel = fei->channel_data[stdemux->tsin_index]; > - > - /* TP re-configuration on page 168 of functional spec */ > - > - /* disable IB (prevents more TS data going to memdma) */ > - writel(0, fei->io + C8SECTPFE_IB_SYS(channel->tsin_id)); > - > - /* disable this channels descriptor */ > - writel(0, channel->irec + DMA_PRDS_TPENABLE); > - > - disable_work_sync(&channel->bh_work); > - > - /* now request memdma channel goes idle */ > - idlereq = (1 << channel->tsin_id) | IDLEREQ; > - writel(idlereq, fei->io + DMA_IDLE_REQ); > - > - /* wait for idle irq handler to signal completion */ > - ret = wait_for_completion_timeout(&channel->idle_completion, > - msecs_to_jiffies(100)); > - > - if (ret == 0) > - dev_warn(fei->dev, > - "Timeout waiting for idle irq on tsin%d\n", > - channel->tsin_id); > - > - reinit_completion(&channel->idle_completion); > - > - /* reset read / write ptrs for this channel */ > - > - writel(channel->back_buffer_busaddr, > - channel->irec + DMA_PRDS_BUSBASE_TP(0)); > - > - tmp = channel->back_buffer_busaddr + FEI_BUFFER_SIZE - 1; > - writel(tmp, channel->irec + DMA_PRDS_BUSTOP_TP(0)); > - > - writel(channel->back_buffer_busaddr, > - channel->irec + DMA_PRDS_BUSWP_TP(0)); > - > - dev_dbg(fei->dev, > - "%s:%d stopping DMA feed on stdemux=%p channel=%d\n", > - __func__, __LINE__, stdemux, channel->tsin_id); > - > - /* turn off all PIDS in the bitmap */ > - memset(channel->pid_buffer_aligned, 0, PID_TABLE_SIZE); > - > - /* manage cache so data is visible to HW */ > - dma_sync_single_for_device(fei->dev, > - channel->pid_buffer_busaddr, > - PID_TABLE_SIZE, > - DMA_TO_DEVICE); > - > - channel->active = 0; > - } > - > - if (--fei->global_feed_count == 0) { > - dev_dbg(fei->dev, "%s:%d global_feed_count=%d\n" > - , __func__, __LINE__, fei->global_feed_count); > - > - timer_delete(&fei->timer); > - } > - > - mutex_unlock(&fei->lock); > - > - return 0; > -} > - > -static struct channel_info *find_channel(struct c8sectpfei *fei, int tsin_num) > -{ > - int i; > - > - for (i = 0; i < C8SECTPFE_MAX_TSIN_CHAN; i++) { > - if (!fei->channel_data[i]) > - continue; > - > - if (fei->channel_data[i]->tsin_id == tsin_num) > - return fei->channel_data[i]; > - } > - > - return NULL; > -} > - > -static void c8sectpfe_getconfig(struct c8sectpfei *fei) > -{ > - struct c8sectpfe_hw *hw = &fei->hw_stats; > - > - hw->num_ib = readl(fei->io + SYS_CFG_NUM_IB); > - hw->num_mib = readl(fei->io + SYS_CFG_NUM_MIB); > - hw->num_swts = readl(fei->io + SYS_CFG_NUM_SWTS); > - hw->num_tsout = readl(fei->io + SYS_CFG_NUM_TSOUT); > - hw->num_ccsc = readl(fei->io + SYS_CFG_NUM_CCSC); > - hw->num_ram = readl(fei->io + SYS_CFG_NUM_RAM); > - hw->num_tp = readl(fei->io + SYS_CFG_NUM_TP); > - > - dev_info(fei->dev, "C8SECTPFE hw supports the following:\n"); > - dev_info(fei->dev, "Input Blocks: %d\n", hw->num_ib); > - dev_info(fei->dev, "Merged Input Blocks: %d\n", hw->num_mib); > - dev_info(fei->dev, "Software Transport Stream Inputs: %d\n" > - , hw->num_swts); > - dev_info(fei->dev, "Transport Stream Output: %d\n", hw->num_tsout); > - dev_info(fei->dev, "Cable Card Converter: %d\n", hw->num_ccsc); > - dev_info(fei->dev, "RAMs supported by C8SECTPFE: %d\n", hw->num_ram); > - dev_info(fei->dev, "Tango TPs supported by C8SECTPFE: %d\n" > - , hw->num_tp); > -} > - > -static irqreturn_t c8sectpfe_idle_irq_handler(int irq, void *priv) > -{ > - struct c8sectpfei *fei = priv; > - struct channel_info *chan; > - int bit; > - unsigned long tmp = readl(fei->io + DMA_IDLE_REQ); > - > - /* page 168 of functional spec: Clear the idle request > - by writing 0 to the C8SECTPFE_DMA_IDLE_REQ register. */ > - > - /* signal idle completion */ > - for_each_set_bit(bit, &tmp, fei->hw_stats.num_ib) { > - > - chan = find_channel(fei, bit); > - > - if (chan) > - complete(&chan->idle_completion); > - } > - > - writel(0, fei->io + DMA_IDLE_REQ); > - > - return IRQ_HANDLED; > -} > - > - > -static void free_input_block(struct c8sectpfei *fei, struct channel_info *tsin) > -{ > - if (!fei || !tsin) > - return; > - > - if (tsin->back_buffer_busaddr) > - if (!dma_mapping_error(fei->dev, tsin->back_buffer_busaddr)) > - dma_unmap_single(fei->dev, tsin->back_buffer_busaddr, > - FEI_BUFFER_SIZE, DMA_BIDIRECTIONAL); > - > - kfree(tsin->back_buffer_start); > - > - if (tsin->pid_buffer_busaddr) > - if (!dma_mapping_error(fei->dev, tsin->pid_buffer_busaddr)) > - dma_unmap_single(fei->dev, tsin->pid_buffer_busaddr, > - PID_TABLE_SIZE, DMA_BIDIRECTIONAL); > - > - kfree(tsin->pid_buffer_start); > -} > - > -#define MAX_NAME 20 > - > -static int configure_memdma_and_inputblock(struct c8sectpfei *fei, > - struct channel_info *tsin) > -{ > - int ret; > - u32 tmp; > - char tsin_pin_name[MAX_NAME]; > - > - if (!fei || !tsin) > - return -EINVAL; > - > - dev_dbg(fei->dev, "%s:%d Configuring channel=%p tsin=%d\n" > - , __func__, __LINE__, tsin, tsin->tsin_id); > - > - init_completion(&tsin->idle_completion); > - > - tsin->back_buffer_start = kzalloc(FEI_BUFFER_SIZE + FEI_ALIGNMENT, GFP_KERNEL); > - if (!tsin->back_buffer_start) { > - ret = -ENOMEM; > - goto err_unmap; > - } > - > - /* Ensure backbuffer is 32byte aligned */ > - tsin->back_buffer_aligned = tsin->back_buffer_start + FEI_ALIGNMENT; > - > - tsin->back_buffer_aligned = PTR_ALIGN(tsin->back_buffer_aligned, FEI_ALIGNMENT); > - > - tsin->back_buffer_busaddr = dma_map_single(fei->dev, > - tsin->back_buffer_aligned, > - FEI_BUFFER_SIZE, > - DMA_BIDIRECTIONAL); > - > - if (dma_mapping_error(fei->dev, tsin->back_buffer_busaddr)) { > - dev_err(fei->dev, "failed to map back_buffer\n"); > - ret = -EFAULT; > - goto err_unmap; > - } > - > - /* > - * The pid buffer can be configured (in hw) for byte or bit > - * per pid. By powers of deduction we conclude stih407 family > - * is configured (at SoC design stage) for bit per pid. > - */ > - tsin->pid_buffer_start = kzalloc(PID_TABLE_SIZE + PID_TABLE_SIZE, GFP_KERNEL); > - if (!tsin->pid_buffer_start) { > - ret = -ENOMEM; > - goto err_unmap; > - } > - > - /* > - * PID buffer needs to be aligned to size of the pid table > - * which at bit per pid is 1024 bytes (8192 pids / 8). > - * PIDF_BASE register enforces this alignment when writing > - * the register. > - */ > - > - tsin->pid_buffer_aligned = tsin->pid_buffer_start + PID_TABLE_SIZE; > - > - tsin->pid_buffer_aligned = PTR_ALIGN(tsin->pid_buffer_aligned, PID_TABLE_SIZE); > - > - tsin->pid_buffer_busaddr = dma_map_single(fei->dev, > - tsin->pid_buffer_aligned, > - PID_TABLE_SIZE, > - DMA_BIDIRECTIONAL); > - > - if (dma_mapping_error(fei->dev, tsin->pid_buffer_busaddr)) { > - dev_err(fei->dev, "failed to map pid_bitmap\n"); > - ret = -EFAULT; > - goto err_unmap; > - } > - > - /* manage cache so pid bitmap is visible to HW */ > - dma_sync_single_for_device(fei->dev, > - tsin->pid_buffer_busaddr, > - PID_TABLE_SIZE, > - DMA_TO_DEVICE); > - > - snprintf(tsin_pin_name, MAX_NAME, "tsin%d-%s", tsin->tsin_id, > - (tsin->serial_not_parallel ? "serial" : "parallel")); > - > - tsin->pstate = pinctrl_lookup_state(fei->pinctrl, tsin_pin_name); > - if (IS_ERR(tsin->pstate)) { > - dev_err(fei->dev, "%s: pinctrl_lookup_state couldn't find %s state\n" > - , __func__, tsin_pin_name); > - ret = PTR_ERR(tsin->pstate); > - goto err_unmap; > - } > - > - ret = pinctrl_select_state(fei->pinctrl, tsin->pstate); > - > - if (ret) { > - dev_err(fei->dev, "%s: pinctrl_select_state failed\n" > - , __func__); > - goto err_unmap; > - } > - > - /* Enable this input block */ > - tmp = readl(fei->io + SYS_INPUT_CLKEN); > - tmp |= BIT(tsin->tsin_id); > - writel(tmp, fei->io + SYS_INPUT_CLKEN); > - > - if (tsin->serial_not_parallel) > - tmp |= C8SECTPFE_SERIAL_NOT_PARALLEL; > - > - if (tsin->invert_ts_clk) > - tmp |= C8SECTPFE_INVERT_TSCLK; > - > - if (tsin->async_not_sync) > - tmp |= C8SECTPFE_ASYNC_NOT_SYNC; > - > - tmp |= C8SECTPFE_ALIGN_BYTE_SOP | C8SECTPFE_BYTE_ENDIANNESS_MSB; > - > - writel(tmp, fei->io + C8SECTPFE_IB_IP_FMT_CFG(tsin->tsin_id)); > - > - writel(C8SECTPFE_SYNC(0x9) | > - C8SECTPFE_DROP(0x9) | > - C8SECTPFE_TOKEN(0x47), > - fei->io + C8SECTPFE_IB_SYNCLCKDRP_CFG(tsin->tsin_id)); > - > - writel(TS_PKT_SIZE, fei->io + C8SECTPFE_IB_PKT_LEN(tsin->tsin_id)); > - > - /* Place the FIFO's at the end of the irec descriptors */ > - > - tsin->fifo = (tsin->tsin_id * FIFO_LEN); > - > - writel(tsin->fifo, fei->io + C8SECTPFE_IB_BUFF_STRT(tsin->tsin_id)); > - writel(tsin->fifo + FIFO_LEN - 1, > - fei->io + C8SECTPFE_IB_BUFF_END(tsin->tsin_id)); > - > - writel(tsin->fifo, fei->io + C8SECTPFE_IB_READ_PNT(tsin->tsin_id)); > - writel(tsin->fifo, fei->io + C8SECTPFE_IB_WRT_PNT(tsin->tsin_id)); > - > - writel(tsin->pid_buffer_busaddr, > - fei->io + PIDF_BASE(tsin->tsin_id)); > - > - dev_dbg(fei->dev, "chan=%d PIDF_BASE=0x%x pid_bus_addr=%pad\n", > - tsin->tsin_id, readl(fei->io + PIDF_BASE(tsin->tsin_id)), > - &tsin->pid_buffer_busaddr); > - > - /* Configure and enable HW PID filtering */ > - > - /* > - * The PID value is created by assembling the first 8 bytes of > - * the TS packet into a 64-bit word in big-endian format. A > - * slice of that 64-bit word is taken from > - * (PID_OFFSET+PID_NUM_BITS-1) to PID_OFFSET. > - */ > - tmp = (C8SECTPFE_PID_ENABLE | C8SECTPFE_PID_NUMBITS(13) > - | C8SECTPFE_PID_OFFSET(40)); > - > - writel(tmp, fei->io + C8SECTPFE_IB_PID_SET(tsin->tsin_id)); > - > - dev_dbg(fei->dev, "chan=%d setting wp: %d, rp: %d, buf: %d-%d\n", > - tsin->tsin_id, > - readl(fei->io + C8SECTPFE_IB_WRT_PNT(tsin->tsin_id)), > - readl(fei->io + C8SECTPFE_IB_READ_PNT(tsin->tsin_id)), > - readl(fei->io + C8SECTPFE_IB_BUFF_STRT(tsin->tsin_id)), > - readl(fei->io + C8SECTPFE_IB_BUFF_END(tsin->tsin_id))); > - > - /* Get base addpress of pointer record block from DMEM */ > - tsin->irec = fei->io + DMA_MEMDMA_OFFSET + DMA_DMEM_OFFSET + > - readl(fei->io + DMA_PTRREC_BASE); > - > - /* fill out pointer record data structure */ > - > - /* advance pointer record block to our channel */ > - tsin->irec += (tsin->tsin_id * DMA_PRDS_SIZE); > - > - writel(tsin->fifo, tsin->irec + DMA_PRDS_MEMBASE); > - > - writel(tsin->fifo + FIFO_LEN - 1, tsin->irec + DMA_PRDS_MEMTOP); > - > - writel((188 + 7)&~7, tsin->irec + DMA_PRDS_PKTSIZE); > - > - writel(0x1, tsin->irec + DMA_PRDS_TPENABLE); > - > - /* read/write pointers with physical bus address */ > - > - writel(tsin->back_buffer_busaddr, tsin->irec + DMA_PRDS_BUSBASE_TP(0)); > - > - tmp = tsin->back_buffer_busaddr + FEI_BUFFER_SIZE - 1; > - writel(tmp, tsin->irec + DMA_PRDS_BUSTOP_TP(0)); > - > - writel(tsin->back_buffer_busaddr, tsin->irec + DMA_PRDS_BUSWP_TP(0)); > - writel(tsin->back_buffer_busaddr, tsin->irec + DMA_PRDS_BUSRP_TP(0)); > - > - /* initialize bh work */ > - INIT_WORK(&tsin->bh_work, channel_swdemux_bh_work); > - > - return 0; > - > -err_unmap: > - free_input_block(fei, tsin); > - return ret; > -} > - > -static irqreturn_t c8sectpfe_error_irq_handler(int irq, void *priv) > -{ > - struct c8sectpfei *fei = priv; > - > - dev_err(fei->dev, "%s: error handling not yet implemented\n" > - , __func__); > - > - /* > - * TODO FIXME we should detect some error conditions here > - * and ideally do something about them! > - */ > - > - return IRQ_HANDLED; > -} > - > -static int c8sectpfe_probe(struct platform_device *pdev) > -{ > - struct device *dev = &pdev->dev; > - struct device_node *np = dev->of_node; > - struct c8sectpfei *fei; > - struct resource *res; > - int ret, index = 0; > - struct channel_info *tsin; > - > - /* Allocate the c8sectpfei structure */ > - fei = devm_kzalloc(dev, sizeof(struct c8sectpfei), GFP_KERNEL); > - if (!fei) > - return -ENOMEM; > - > - fei->dev = dev; > - > - res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "c8sectpfe"); > - fei->io = devm_ioremap_resource(dev, res); > - if (IS_ERR(fei->io)) > - return PTR_ERR(fei->io); > - > - res = platform_get_resource_byname(pdev, IORESOURCE_MEM, > - "c8sectpfe-ram"); > - fei->sram = devm_ioremap_resource(dev, res); > - if (IS_ERR(fei->sram)) > - return PTR_ERR(fei->sram); > - > - fei->sram_size = resource_size(res); > - > - fei->idle_irq = platform_get_irq_byname(pdev, "c8sectpfe-idle-irq"); > - if (fei->idle_irq < 0) > - return fei->idle_irq; > - > - fei->error_irq = platform_get_irq_byname(pdev, "c8sectpfe-error-irq"); > - if (fei->error_irq < 0) > - return fei->error_irq; > - > - platform_set_drvdata(pdev, fei); > - > - fei->c8sectpfeclk = devm_clk_get_enabled(dev, "c8sectpfe"); > - if (IS_ERR(fei->c8sectpfeclk)) { > - dev_err(dev, "Failed to enable c8sectpfe clock\n"); > - return PTR_ERR(fei->c8sectpfeclk); > - } > - > - /* to save power disable all IP's (on by default) */ > - writel(0, fei->io + SYS_INPUT_CLKEN); > - > - /* Enable memdma clock */ > - writel(MEMDMAENABLE, fei->io + SYS_OTHER_CLKEN); > - > - /* clear internal sram */ > - memset_io(fei->sram, 0x0, fei->sram_size); > - > - c8sectpfe_getconfig(fei); > - > - ret = devm_request_irq(dev, fei->idle_irq, c8sectpfe_idle_irq_handler, > - 0, "c8sectpfe-idle-irq", fei); > - if (ret) { > - dev_err(dev, "Can't register c8sectpfe-idle-irq IRQ.\n"); > - return ret; > - } > - > - ret = devm_request_irq(dev, fei->error_irq, > - c8sectpfe_error_irq_handler, 0, > - "c8sectpfe-error-irq", fei); > - if (ret) { > - dev_err(dev, "Can't register c8sectpfe-error-irq IRQ.\n"); > - return ret; > - } > - > - fei->tsin_count = of_get_child_count(np); > - > - if (fei->tsin_count > C8SECTPFE_MAX_TSIN_CHAN || > - fei->tsin_count > fei->hw_stats.num_ib) { > - > - dev_err(dev, "More tsin declared than exist on SoC!\n"); > - return -EINVAL; > - } > - > - fei->pinctrl = devm_pinctrl_get(dev); > - > - if (IS_ERR(fei->pinctrl)) { > - dev_err(dev, "Error getting tsin pins\n"); > - return PTR_ERR(fei->pinctrl); > - } > - > - for_each_child_of_node_scoped(np, child) { > - struct device_node *i2c_bus; > - > - fei->channel_data[index] = devm_kzalloc(dev, > - sizeof(struct channel_info), > - GFP_KERNEL); > - > - if (!fei->channel_data[index]) > - return -ENOMEM; > - > - tsin = fei->channel_data[index]; > - > - tsin->fei = fei; > - > - ret = of_property_read_u32(child, "tsin-num", &tsin->tsin_id); > - if (ret) { > - dev_err(&pdev->dev, "No tsin_num found\n"); > - return ret; > - } > - > - /* sanity check value */ > - if (tsin->tsin_id > fei->hw_stats.num_ib) { > - dev_err(&pdev->dev, > - "tsin-num %d specified greater than number\n\tof input block hw in SoC! (%d)", > - tsin->tsin_id, fei->hw_stats.num_ib); > - return -EINVAL; > - } > - > - tsin->invert_ts_clk = of_property_read_bool(child, > - "invert-ts-clk"); > - > - tsin->serial_not_parallel = of_property_read_bool(child, > - "serial-not-parallel"); > - > - tsin->async_not_sync = of_property_read_bool(child, > - "async-not-sync"); > - > - ret = of_property_read_u32(child, "dvb-card", > - &tsin->dvb_card); > - if (ret) { > - dev_err(&pdev->dev, "No dvb-card found\n"); > - return ret; > - } > - > - i2c_bus = of_parse_phandle(child, "i2c-bus", 0); > - if (!i2c_bus) { > - dev_err(&pdev->dev, "No i2c-bus found\n"); > - return -ENODEV; > - } > - tsin->i2c_adapter = > - of_find_i2c_adapter_by_node(i2c_bus); > - of_node_put(i2c_bus); > - if (!tsin->i2c_adapter) { > - dev_err(&pdev->dev, "No i2c adapter found\n"); > - return -ENODEV; > - } > - > - /* Acquire reset GPIO and activate it */ > - tsin->rst_gpio = devm_fwnode_gpiod_get(dev, > - of_fwnode_handle(child), > - "reset", GPIOD_OUT_HIGH, > - "NIM reset"); > - ret = PTR_ERR_OR_ZERO(tsin->rst_gpio); > - if (ret && ret != -EBUSY) { > - dev_err(dev, "Can't request tsin%d reset gpio\n", > - fei->channel_data[index]->tsin_id); > - return ret; > - } > - > - if (!ret) { > - /* wait for the chip to reset */ > - usleep_range(3500, 5000); > - /* release the reset line */ > - gpiod_set_value_cansleep(tsin->rst_gpio, 0); > - usleep_range(3000, 5000); > - } > - > - tsin->demux_mapping = index; > - > - dev_dbg(fei->dev, > - "channel=%p n=%d tsin_num=%d, invert-ts-clk=%d\n\tserial-not-parallel=%d pkt-clk-valid=%d dvb-card=%d\n", > - fei->channel_data[index], index, > - tsin->tsin_id, tsin->invert_ts_clk, > - tsin->serial_not_parallel, tsin->async_not_sync, > - tsin->dvb_card); > - > - index++; > - } > - > - /* Setup timer interrupt */ > - timer_setup(&fei->timer, c8sectpfe_timer_interrupt, 0); > - > - mutex_init(&fei->lock); > - > - /* Get the configuration information about the tuners */ > - ret = c8sectpfe_tuner_register_frontend(&fei->c8sectpfe[0], > - (void *)fei, > - c8sectpfe_start_feed, > - c8sectpfe_stop_feed); > - if (ret) { > - dev_err(dev, "c8sectpfe_tuner_register_frontend failed (%d)\n", > - ret); > - return ret; > - } > - > - c8sectpfe_debugfs_init(fei); > - > - return 0; > -} > - > -static void c8sectpfe_remove(struct platform_device *pdev) > -{ > - struct c8sectpfei *fei = platform_get_drvdata(pdev); > - struct channel_info *channel; > - int i; > - > - wait_for_completion(&fei->fw_ack); > - > - c8sectpfe_tuner_unregister_frontend(fei->c8sectpfe[0], fei); > - > - /* > - * Now loop through and un-configure each of the InputBlock resources > - */ > - for (i = 0; i < fei->tsin_count; i++) { > - channel = fei->channel_data[i]; > - free_input_block(fei, channel); > - } > - > - c8sectpfe_debugfs_exit(fei); > - > - dev_info(fei->dev, "Stopping memdma SLIM core\n"); > - if (readl(fei->io + DMA_CPU_RUN)) > - writel(0x0, fei->io + DMA_CPU_RUN); > - > - /* unclock all internal IP's */ > - if (readl(fei->io + SYS_INPUT_CLKEN)) > - writel(0, fei->io + SYS_INPUT_CLKEN); > - > - if (readl(fei->io + SYS_OTHER_CLKEN)) > - writel(0, fei->io + SYS_OTHER_CLKEN); > -} > - > - > -static int configure_channels(struct c8sectpfei *fei) > -{ > - int index = 0, ret; > - struct device_node *np = fei->dev->of_node; > - > - /* iterate round each tsin and configure memdma descriptor and IB hw */ > - for_each_child_of_node_scoped(np, child) { > - ret = configure_memdma_and_inputblock(fei, > - fei->channel_data[index]); > - if (ret) { > - dev_err(fei->dev, > - "configure_memdma_and_inputblock failed\n"); > - goto err_unmap; > - } > - index++; > - } > - > - return 0; > - > -err_unmap: > - while (--index >= 0) > - free_input_block(fei, fei->channel_data[index]); > - > - return ret; > -} > - > -static int > -c8sectpfe_elf_sanity_check(struct c8sectpfei *fei, const struct firmware *fw) > -{ > - struct elf32_hdr *ehdr; > - char class; > - > - if (!fw) { > - dev_err(fei->dev, "failed to load %s\n", FIRMWARE_MEMDMA); > - return -EINVAL; > - } > - > - if (fw->size < sizeof(struct elf32_hdr)) { > - dev_err(fei->dev, "Image is too small\n"); > - return -EINVAL; > - } > - > - ehdr = (struct elf32_hdr *)fw->data; > - > - /* We only support ELF32 at this point */ > - class = ehdr->e_ident[EI_CLASS]; > - if (class != ELFCLASS32) { > - dev_err(fei->dev, "Unsupported class: %d\n", class); > - return -EINVAL; > - } > - > - if (ehdr->e_ident[EI_DATA] != ELFDATA2LSB) { > - dev_err(fei->dev, "Unsupported firmware endianness\n"); > - return -EINVAL; > - } > - > - if (fw->size < ehdr->e_shoff + sizeof(struct elf32_shdr)) { > - dev_err(fei->dev, "Image is too small\n"); > - return -EINVAL; > - } > - > - if (memcmp(ehdr->e_ident, ELFMAG, SELFMAG)) { > - dev_err(fei->dev, "Image is corrupted (bad magic)\n"); > - return -EINVAL; > - } > - > - /* Check ELF magic */ > - ehdr = (Elf32_Ehdr *)fw->data; > - if (ehdr->e_ident[EI_MAG0] != ELFMAG0 || > - ehdr->e_ident[EI_MAG1] != ELFMAG1 || > - ehdr->e_ident[EI_MAG2] != ELFMAG2 || > - ehdr->e_ident[EI_MAG3] != ELFMAG3) { > - dev_err(fei->dev, "Invalid ELF magic\n"); > - return -EINVAL; > - } > - > - if (ehdr->e_type != ET_EXEC) { > - dev_err(fei->dev, "Unsupported ELF header type\n"); > - return -EINVAL; > - } > - > - if (ehdr->e_phoff > fw->size) { > - dev_err(fei->dev, "Firmware size is too small\n"); > - return -EINVAL; > - } > - > - return 0; > -} > - > - > -static void load_imem_segment(struct c8sectpfei *fei, Elf32_Phdr *phdr, > - const struct firmware *fw, u8 __iomem *dest, > - int seg_num) > -{ > - const u8 *imem_src = fw->data + phdr->p_offset; > - int i; > - > - /* > - * For IMEM segments, the segment contains 24-bit > - * instructions which must be padded to 32-bit > - * instructions before being written. The written > - * segment is padded with NOP instructions. > - */ > - > - dev_dbg(fei->dev, > - "Loading IMEM segment %d 0x%08x\n\t (0x%x bytes) -> 0x%p (0x%x bytes)\n", > - seg_num, phdr->p_paddr, phdr->p_filesz, dest, > - phdr->p_memsz + phdr->p_memsz / 3); > - > - for (i = 0; i < phdr->p_filesz; i++) { > - > - writeb(readb((void __iomem *)imem_src), (void __iomem *)dest); > - > - /* Every 3 bytes, add an additional > - * padding zero in destination */ > - if (i % 3 == 2) { > - dest++; > - writeb(0x00, (void __iomem *)dest); > - } > - > - dest++; > - imem_src++; > - } > -} > - > -static void load_dmem_segment(struct c8sectpfei *fei, Elf32_Phdr *phdr, > - const struct firmware *fw, u8 __iomem *dst, int seg_num) > -{ > - /* > - * For DMEM segments copy the segment data from the ELF > - * file and pad segment with zeroes > - */ > - > - dev_dbg(fei->dev, > - "Loading DMEM segment %d 0x%08x\n\t(0x%x bytes) -> 0x%p (0x%x bytes)\n", > - seg_num, phdr->p_paddr, phdr->p_filesz, > - dst, phdr->p_memsz); > - > - memcpy((void __force *)dst, (void *)fw->data + phdr->p_offset, > - phdr->p_filesz); > - > - memset((void __force *)dst + phdr->p_filesz, 0, > - phdr->p_memsz - phdr->p_filesz); > -} > - > -static int load_slim_core_fw(const struct firmware *fw, struct c8sectpfei *fei) > -{ > - Elf32_Ehdr *ehdr; > - Elf32_Phdr *phdr; > - u8 __iomem *dst; > - int err = 0, i; > - > - if (!fw || !fei) > - return -EINVAL; > - > - ehdr = (Elf32_Ehdr *)fw->data; > - phdr = (Elf32_Phdr *)(fw->data + ehdr->e_phoff); > - > - /* go through the available ELF segments */ > - for (i = 0; i < ehdr->e_phnum; i++, phdr++) { > - > - /* Only consider LOAD segments */ > - if (phdr->p_type != PT_LOAD) > - continue; > - > - /* > - * Check segment is contained within the fw->data buffer > - */ > - if (phdr->p_offset + phdr->p_filesz > fw->size) { > - dev_err(fei->dev, > - "Segment %d is outside of firmware file\n", i); > - err = -EINVAL; > - break; > - } > - > - /* > - * MEMDMA IMEM has executable flag set, otherwise load > - * this segment into DMEM. > - * > - */ > - > - if (phdr->p_flags & PF_X) { > - dst = (u8 __iomem *) fei->io + DMA_MEMDMA_IMEM; > - /* > - * The Slim ELF file uses 32-bit word addressing for > - * load offsets. > - */ > - dst += (phdr->p_paddr & 0xFFFFF) * sizeof(unsigned int); > - load_imem_segment(fei, phdr, fw, dst, i); > - } else { > - dst = (u8 __iomem *) fei->io + DMA_MEMDMA_DMEM; > - /* > - * The Slim ELF file uses 32-bit word addressing for > - * load offsets. > - */ > - dst += (phdr->p_paddr & 0xFFFFF) * sizeof(unsigned int); > - load_dmem_segment(fei, phdr, fw, dst, i); > - } > - } > - > - return err; > -} > - > -static int load_c8sectpfe_fw(struct c8sectpfei *fei) > -{ > - const struct firmware *fw; > - int err; > - > - dev_info(fei->dev, "Loading firmware: %s\n", FIRMWARE_MEMDMA); > - > - err = request_firmware(&fw, FIRMWARE_MEMDMA, fei->dev); > - if (err) > - return err; > - > - err = c8sectpfe_elf_sanity_check(fei, fw); > - if (err) { > - dev_err(fei->dev, "c8sectpfe_elf_sanity_check failed err=(%d)\n" > - , err); > - release_firmware(fw); > - return err; > - } > - > - err = load_slim_core_fw(fw, fei); > - release_firmware(fw); > - if (err) { > - dev_err(fei->dev, "load_slim_core_fw failed err=(%d)\n", err); > - return err; > - } > - > - /* now the firmware is loaded configure the input blocks */ > - err = configure_channels(fei); > - if (err) { > - dev_err(fei->dev, "configure_channels failed err=(%d)\n", err); > - return err; > - } > - > - /* > - * STBus target port can access IMEM and DMEM ports > - * without waiting for CPU > - */ > - writel(0x1, fei->io + DMA_PER_STBUS_SYNC); > - > - dev_info(fei->dev, "Boot the memdma SLIM core\n"); > - writel(0x1, fei->io + DMA_CPU_RUN); > - > - atomic_set(&fei->fw_loaded, 1); > - > - return 0; > -} > - > -static const struct of_device_id c8sectpfe_match[] = { > - { .compatible = "st,stih407-c8sectpfe" }, > - { /* sentinel */ }, > -}; > -MODULE_DEVICE_TABLE(of, c8sectpfe_match); > - > -static struct platform_driver c8sectpfe_driver = { > - .driver = { > - .name = "c8sectpfe", > - .of_match_table = c8sectpfe_match, > - }, > - .probe = c8sectpfe_probe, > - .remove = c8sectpfe_remove, > -}; > - > -module_platform_driver(c8sectpfe_driver); > - > -MODULE_AUTHOR("Peter Bennett <peter.bennett@st.com>"); > -MODULE_AUTHOR("Peter Griffin <peter.griffin@linaro.org>"); > -MODULE_DESCRIPTION("C8SECTPFE STi DVB Driver"); > -MODULE_LICENSE("GPL"); > diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.h b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.h > deleted file mode 100644 > index c1b124c6ef128a6fe3fd5cbe5f5f3aee1b034af1..0000000000000000000000000000000000000000 > --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.h > +++ /dev/null > @@ -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_ */ > diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-debugfs.c b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-debugfs.c > deleted file mode 100644 > index 301fa10f419b6a7c9a1b50d759fd0fbbfc0f7692..0000000000000000000000000000000000000000 > --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-debugfs.c > +++ /dev/null > @@ -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; > -} > diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-debugfs.h b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-debugfs.h > deleted file mode 100644 > index 3fe177b59b16d2789cde2438367d6f4cbfd9c832..0000000000000000000000000000000000000000 > --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-debugfs.h > +++ /dev/null > @@ -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 */ > diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-dvb.c b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-dvb.c > deleted file mode 100644 > index feb48cb546d7f11efb62339b8389187f5cec43c9..0000000000000000000000000000000000000000 > --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-dvb.c > +++ /dev/null > @@ -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; > -} > diff --git a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-dvb.h b/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-dvb.h > deleted file mode 100644 > index 3d87a9ae8702d40629a8aa0a0ee76ddf1ad815b8..0000000000000000000000000000000000000000 > --- a/drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-dvb.h > +++ /dev/null > @@ -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 > Hi Raphael Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com> Thanks Patrice ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v2 2/5] media: include: remove c8sectpfe header 2025-09-12 11:36 [PATCH v2 0/5] STi drivers cleanup Raphael Gallais-Pou 2025-09-12 11:36 ` [PATCH v2 1/5] media: c8sectpfe: remove support of STi c8sectpfe driver Raphael Gallais-Pou @ 2025-09-12 11:36 ` Raphael Gallais-Pou 2025-09-12 14:28 ` Patrice CHOTARD 2025-09-15 21:25 ` Rob Herring (Arm) 2025-09-12 11:36 ` [PATCH v2 3/5] dt-bindings: media: remove support of stih407-c8sectpfe Raphael Gallais-Pou ` (2 subsequent siblings) 4 siblings, 2 replies; 18+ messages in thread From: Raphael Gallais-Pou @ 2025-09-12 11:36 UTC (permalink / raw) To: Patrice Chotard, Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Michael Turquette, Stephen Boyd Cc: linux-kernel, linux-media, devicetree, linux-clk Driver is not used anymore. Remove header file. Signed-off-by: Raphael Gallais-Pou <rgallaispou@gmail.com> --- include/dt-bindings/media/c8sectpfe.h | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/include/dt-bindings/media/c8sectpfe.h b/include/dt-bindings/media/c8sectpfe.h deleted file mode 100644 index 6b1fb6f5413b8c5fbcf7dc2d786468ee3428caaf..0000000000000000000000000000000000000000 --- a/include/dt-bindings/media/c8sectpfe.h +++ /dev/null @@ -1,13 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef __DT_C8SECTPFE_H -#define __DT_C8SECTPFE_H - -#define STV0367_TDA18212_NIMA_1 0 -#define STV0367_TDA18212_NIMA_2 1 -#define STV0367_TDA18212_NIMB_1 2 -#define STV0367_TDA18212_NIMB_2 3 - -#define STV0903_6110_LNB24_NIMA 4 -#define STV0903_6110_LNB24_NIMB 5 - -#endif /* __DT_C8SECTPFE_H */ -- 2.51.0 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH v2 2/5] media: include: remove c8sectpfe header 2025-09-12 11:36 ` [PATCH v2 2/5] media: include: remove c8sectpfe header Raphael Gallais-Pou @ 2025-09-12 14:28 ` Patrice CHOTARD 2025-09-15 21:25 ` Rob Herring (Arm) 1 sibling, 0 replies; 18+ messages in thread From: Patrice CHOTARD @ 2025-09-12 14:28 UTC (permalink / raw) To: Raphael Gallais-Pou, Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Michael Turquette, Stephen Boyd Cc: linux-kernel, linux-media, devicetree, linux-clk On 9/12/25 13:36, Raphael Gallais-Pou wrote: > Driver is not used anymore. Remove header file. > > Signed-off-by: Raphael Gallais-Pou <rgallaispou@gmail.com> > --- > include/dt-bindings/media/c8sectpfe.h | 13 ------------- > 1 file changed, 13 deletions(-) > > diff --git a/include/dt-bindings/media/c8sectpfe.h b/include/dt-bindings/media/c8sectpfe.h > deleted file mode 100644 > index 6b1fb6f5413b8c5fbcf7dc2d786468ee3428caaf..0000000000000000000000000000000000000000 > --- a/include/dt-bindings/media/c8sectpfe.h > +++ /dev/null > @@ -1,13 +0,0 @@ > -/* SPDX-License-Identifier: GPL-2.0 */ > -#ifndef __DT_C8SECTPFE_H > -#define __DT_C8SECTPFE_H > - > -#define STV0367_TDA18212_NIMA_1 0 > -#define STV0367_TDA18212_NIMA_2 1 > -#define STV0367_TDA18212_NIMB_1 2 > -#define STV0367_TDA18212_NIMB_2 3 > - > -#define STV0903_6110_LNB24_NIMA 4 > -#define STV0903_6110_LNB24_NIMB 5 > - > -#endif /* __DT_C8SECTPFE_H */ > Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com> Thanks Patrice ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 2/5] media: include: remove c8sectpfe header 2025-09-12 11:36 ` [PATCH v2 2/5] media: include: remove c8sectpfe header Raphael Gallais-Pou 2025-09-12 14:28 ` Patrice CHOTARD @ 2025-09-15 21:25 ` Rob Herring (Arm) 1 sibling, 0 replies; 18+ messages in thread From: Rob Herring (Arm) @ 2025-09-15 21:25 UTC (permalink / raw) To: Raphael Gallais-Pou Cc: Mauro Carvalho Chehab, linux-media, devicetree, linux-kernel, Krzysztof Kozlowski, Patrice Chotard, Stephen Boyd, linux-clk, Michael Turquette, Conor Dooley On Fri, 12 Sep 2025 13:36:09 +0200, Raphael Gallais-Pou wrote: > Driver is not used anymore. Remove header file. > > Signed-off-by: Raphael Gallais-Pou <rgallaispou@gmail.com> > --- > include/dt-bindings/media/c8sectpfe.h | 13 ------------- > 1 file changed, 13 deletions(-) > Acked-by: Rob Herring (Arm) <robh@kernel.org> ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v2 3/5] dt-bindings: media: remove support of stih407-c8sectpfe 2025-09-12 11:36 [PATCH v2 0/5] STi drivers cleanup Raphael Gallais-Pou 2025-09-12 11:36 ` [PATCH v2 1/5] media: c8sectpfe: remove support of STi c8sectpfe driver Raphael Gallais-Pou 2025-09-12 11:36 ` [PATCH v2 2/5] media: include: remove c8sectpfe header Raphael Gallais-Pou @ 2025-09-12 11:36 ` Raphael Gallais-Pou 2025-09-12 14:31 ` Patrice CHOTARD 2025-09-15 21:26 ` Rob Herring (Arm) 2025-09-12 11:36 ` [PATCH v2 4/5] clk: st: flexgen: remove unused compatible Raphael Gallais-Pou 2025-09-12 11:36 ` [PATCH v2 5/5] dt-bindings: clock: st: flexgen: remove deprecated compatibles Raphael Gallais-Pou 4 siblings, 2 replies; 18+ messages in thread From: Raphael Gallais-Pou @ 2025-09-12 11:36 UTC (permalink / raw) To: Patrice Chotard, Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Michael Turquette, Stephen Boyd Cc: linux-kernel, linux-media, devicetree, linux-clk Remove files documentation from stih407-c8sectpfe driver. Signed-off-by: Raphael Gallais-Pou <rgallaispou@gmail.com> --- .../admin-guide/media/platform-cardlist.rst | 2 - .../bindings/media/stih407-c8sectpfe.txt | 88 ---------------------- 2 files changed, 90 deletions(-) diff --git a/Documentation/admin-guide/media/platform-cardlist.rst b/Documentation/admin-guide/media/platform-cardlist.rst index 1230ae4037ad551087d4cddc8a02eab5eac2be71..63f4b19c3628f3488fd2ccd1a6dab385d46b2503 100644 --- a/Documentation/admin-guide/media/platform-cardlist.rst +++ b/Documentation/admin-guide/media/platform-cardlist.rst @@ -18,8 +18,6 @@ am437x-vpfe TI AM437x VPFE aspeed-video Aspeed AST2400 and AST2500 atmel-isc ATMEL Image Sensor Controller (ISC) atmel-isi ATMEL Image Sensor Interface (ISI) -c8sectpfe SDR platform devices -c8sectpfe SDR platform devices cafe_ccic Marvell 88ALP01 (Cafe) CMOS Camera Controller cdns-csi2rx Cadence MIPI-CSI2 RX Controller cdns-csi2tx Cadence MIPI-CSI2 TX Controller diff --git a/Documentation/devicetree/bindings/media/stih407-c8sectpfe.txt b/Documentation/devicetree/bindings/media/stih407-c8sectpfe.txt deleted file mode 100644 index 880d4d70c9fd741ac13101721ced18f04336c373..0000000000000000000000000000000000000000 --- a/Documentation/devicetree/bindings/media/stih407-c8sectpfe.txt +++ /dev/null @@ -1,88 +0,0 @@ -STMicroelectronics STi c8sectpfe binding -============================================ - -This document describes the c8sectpfe device bindings that is used to get transport -stream data into the SoC on the TS pins, and into DDR for further processing. - -It is typically used in conjunction with one or more demodulator and tuner devices -which converts from the RF to digital domain. Demodulators and tuners are usually -located on an external DVB frontend card connected to SoC TS input pins. - -Currently 7 TS input (tsin) channels are supported on the stih407 family SoC. - -Required properties (controller (parent) node): -- compatible : Should be "stih407-c8sectpfe" - -- reg : Address and length of register sets for each device in - "reg-names" - -- reg-names : The names of the register addresses corresponding to the - registers filled in "reg": - - c8sectpfe: c8sectpfe registers - - c8sectpfe-ram: c8sectpfe internal sram - -- clocks : phandle list of c8sectpfe clocks -- clock-names : should be "c8sectpfe" -See: Documentation/devicetree/bindings/clock/clock-bindings.txt - -- pinctrl-names : a pinctrl state named tsin%d-serial or tsin%d-parallel (where %d is tsin-num) - must be defined for each tsin child node. -- pinctrl-0 : phandle referencing pin configuration for this tsin configuration -See: Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt - - -Required properties (tsin (child) node): - -- tsin-num : tsin id of the InputBlock (must be between 0 to 6) -- i2c-bus : phandle to the I2C bus DT node which the demodulators & tuners on this tsin channel are connected. -- reset-gpios : reset gpio for this tsin channel. - -Optional properties (tsin (child) node): - -- invert-ts-clk : Bool property to control sense of ts input clock (data stored on falling edge of clk). -- serial-not-parallel : Bool property to configure input bus width (serial on ts_data<7>). -- async-not-sync : Bool property to control if data is received in asynchronous mode - (all bits/bytes with ts_valid or ts_packet asserted are valid). - -- dvb-card : Describes the NIM card connected to this tsin channel. - -Example: - -/* stih410 SoC b2120 + b2004a + stv0367-pll(NIMB) + stv0367-tda18212 (NIMA) DT example) */ - - c8sectpfe@8a20000 { - compatible = "st,stih407-c8sectpfe"; - reg = <0x08a20000 0x10000>, <0x08a00000 0x4000>; - reg-names = "stfe", "stfe-ram"; - interrupts = <GIC_SPI 34 IRQ_TYPE_NONE>, <GIC_SPI 35 IRQ_TYPE_NONE>; - interrupt-names = "stfe-error-irq", "stfe-idle-irq"; - pinctrl-0 = <&pinctrl_tsin0_serial>; - pinctrl-1 = <&pinctrl_tsin0_parallel>; - pinctrl-2 = <&pinctrl_tsin3_serial>; - pinctrl-3 = <&pinctrl_tsin4_serial_alt3>; - pinctrl-4 = <&pinctrl_tsin5_serial_alt1>; - pinctrl-names = "tsin0-serial", - "tsin0-parallel", - "tsin3-serial", - "tsin4-serial", - "tsin5-serial"; - clocks = <&clk_s_c0_flexgen CLK_PROC_STFE>; - clock-names = "c8sectpfe"; - - /* tsin0 is TSA on NIMA */ - tsin0: port@0 { - tsin-num = <0>; - serial-not-parallel; - i2c-bus = <&ssc2>; - reset-gpios = <&pio15 4 GPIO_ACTIVE_HIGH>; - dvb-card = <STV0367_TDA18212_NIMA_1>; - }; - - tsin3: port@3 { - tsin-num = <3>; - serial-not-parallel; - i2c-bus = <&ssc3>; - reset-gpios = <&pio15 7 GPIO_ACTIVE_HIGH>; - dvb-card = <STV0367_TDA18212_NIMB_1>; - }; - }; -- 2.51.0 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH v2 3/5] dt-bindings: media: remove support of stih407-c8sectpfe 2025-09-12 11:36 ` [PATCH v2 3/5] dt-bindings: media: remove support of stih407-c8sectpfe Raphael Gallais-Pou @ 2025-09-12 14:31 ` Patrice CHOTARD 2025-09-15 21:26 ` Rob Herring (Arm) 1 sibling, 0 replies; 18+ messages in thread From: Patrice CHOTARD @ 2025-09-12 14:31 UTC (permalink / raw) To: Raphael Gallais-Pou, Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Michael Turquette, Stephen Boyd Cc: linux-kernel, linux-media, devicetree, linux-clk On 9/12/25 13:36, Raphael Gallais-Pou wrote: > Remove files documentation from stih407-c8sectpfe driver. > > Signed-off-by: Raphael Gallais-Pou <rgallaispou@gmail.com> > --- > .../admin-guide/media/platform-cardlist.rst | 2 - > .../bindings/media/stih407-c8sectpfe.txt | 88 ---------------------- > 2 files changed, 90 deletions(-) > > diff --git a/Documentation/admin-guide/media/platform-cardlist.rst b/Documentation/admin-guide/media/platform-cardlist.rst > index 1230ae4037ad551087d4cddc8a02eab5eac2be71..63f4b19c3628f3488fd2ccd1a6dab385d46b2503 100644 > --- a/Documentation/admin-guide/media/platform-cardlist.rst > +++ b/Documentation/admin-guide/media/platform-cardlist.rst > @@ -18,8 +18,6 @@ am437x-vpfe TI AM437x VPFE > aspeed-video Aspeed AST2400 and AST2500 > atmel-isc ATMEL Image Sensor Controller (ISC) > atmel-isi ATMEL Image Sensor Interface (ISI) > -c8sectpfe SDR platform devices > -c8sectpfe SDR platform devices > cafe_ccic Marvell 88ALP01 (Cafe) CMOS Camera Controller > cdns-csi2rx Cadence MIPI-CSI2 RX Controller > cdns-csi2tx Cadence MIPI-CSI2 TX Controller > diff --git a/Documentation/devicetree/bindings/media/stih407-c8sectpfe.txt b/Documentation/devicetree/bindings/media/stih407-c8sectpfe.txt > deleted file mode 100644 > index 880d4d70c9fd741ac13101721ced18f04336c373..0000000000000000000000000000000000000000 > --- a/Documentation/devicetree/bindings/media/stih407-c8sectpfe.txt > +++ /dev/null > @@ -1,88 +0,0 @@ > -STMicroelectronics STi c8sectpfe binding > -============================================ > - > -This document describes the c8sectpfe device bindings that is used to get transport > -stream data into the SoC on the TS pins, and into DDR for further processing. > - > -It is typically used in conjunction with one or more demodulator and tuner devices > -which converts from the RF to digital domain. Demodulators and tuners are usually > -located on an external DVB frontend card connected to SoC TS input pins. > - > -Currently 7 TS input (tsin) channels are supported on the stih407 family SoC. > - > -Required properties (controller (parent) node): > -- compatible : Should be "stih407-c8sectpfe" > - > -- reg : Address and length of register sets for each device in > - "reg-names" > - > -- reg-names : The names of the register addresses corresponding to the > - registers filled in "reg": > - - c8sectpfe: c8sectpfe registers > - - c8sectpfe-ram: c8sectpfe internal sram > - > -- clocks : phandle list of c8sectpfe clocks > -- clock-names : should be "c8sectpfe" > -See: Documentation/devicetree/bindings/clock/clock-bindings.txt > - > -- pinctrl-names : a pinctrl state named tsin%d-serial or tsin%d-parallel (where %d is tsin-num) > - must be defined for each tsin child node. > -- pinctrl-0 : phandle referencing pin configuration for this tsin configuration > -See: Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt > - > - > -Required properties (tsin (child) node): > - > -- tsin-num : tsin id of the InputBlock (must be between 0 to 6) > -- i2c-bus : phandle to the I2C bus DT node which the demodulators & tuners on this tsin channel are connected. > -- reset-gpios : reset gpio for this tsin channel. > - > -Optional properties (tsin (child) node): > - > -- invert-ts-clk : Bool property to control sense of ts input clock (data stored on falling edge of clk). > -- serial-not-parallel : Bool property to configure input bus width (serial on ts_data<7>). > -- async-not-sync : Bool property to control if data is received in asynchronous mode > - (all bits/bytes with ts_valid or ts_packet asserted are valid). > - > -- dvb-card : Describes the NIM card connected to this tsin channel. > - > -Example: > - > -/* stih410 SoC b2120 + b2004a + stv0367-pll(NIMB) + stv0367-tda18212 (NIMA) DT example) */ > - > - c8sectpfe@8a20000 { > - compatible = "st,stih407-c8sectpfe"; > - reg = <0x08a20000 0x10000>, <0x08a00000 0x4000>; > - reg-names = "stfe", "stfe-ram"; > - interrupts = <GIC_SPI 34 IRQ_TYPE_NONE>, <GIC_SPI 35 IRQ_TYPE_NONE>; > - interrupt-names = "stfe-error-irq", "stfe-idle-irq"; > - pinctrl-0 = <&pinctrl_tsin0_serial>; > - pinctrl-1 = <&pinctrl_tsin0_parallel>; > - pinctrl-2 = <&pinctrl_tsin3_serial>; > - pinctrl-3 = <&pinctrl_tsin4_serial_alt3>; > - pinctrl-4 = <&pinctrl_tsin5_serial_alt1>; > - pinctrl-names = "tsin0-serial", > - "tsin0-parallel", > - "tsin3-serial", > - "tsin4-serial", > - "tsin5-serial"; > - clocks = <&clk_s_c0_flexgen CLK_PROC_STFE>; > - clock-names = "c8sectpfe"; > - > - /* tsin0 is TSA on NIMA */ > - tsin0: port@0 { > - tsin-num = <0>; > - serial-not-parallel; > - i2c-bus = <&ssc2>; > - reset-gpios = <&pio15 4 GPIO_ACTIVE_HIGH>; > - dvb-card = <STV0367_TDA18212_NIMA_1>; > - }; > - > - tsin3: port@3 { > - tsin-num = <3>; > - serial-not-parallel; > - i2c-bus = <&ssc3>; > - reset-gpios = <&pio15 7 GPIO_ACTIVE_HIGH>; > - dvb-card = <STV0367_TDA18212_NIMB_1>; > - }; > - }; > Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com> Thanks Patrice ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 3/5] dt-bindings: media: remove support of stih407-c8sectpfe 2025-09-12 11:36 ` [PATCH v2 3/5] dt-bindings: media: remove support of stih407-c8sectpfe Raphael Gallais-Pou 2025-09-12 14:31 ` Patrice CHOTARD @ 2025-09-15 21:26 ` Rob Herring (Arm) 1 sibling, 0 replies; 18+ messages in thread From: Rob Herring (Arm) @ 2025-09-15 21:26 UTC (permalink / raw) To: Raphael Gallais-Pou Cc: devicetree, Mauro Carvalho Chehab, Stephen Boyd, Krzysztof Kozlowski, linux-media, linux-clk, Conor Dooley, linux-kernel, Michael Turquette, Patrice Chotard On Fri, 12 Sep 2025 13:36:10 +0200, Raphael Gallais-Pou wrote: > Remove files documentation from stih407-c8sectpfe driver. > > Signed-off-by: Raphael Gallais-Pou <rgallaispou@gmail.com> > --- > .../admin-guide/media/platform-cardlist.rst | 2 - > .../bindings/media/stih407-c8sectpfe.txt | 88 ---------------------- > 2 files changed, 90 deletions(-) > Acked-by: Rob Herring (Arm) <robh@kernel.org> ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v2 4/5] clk: st: flexgen: remove unused compatible 2025-09-12 11:36 [PATCH v2 0/5] STi drivers cleanup Raphael Gallais-Pou ` (2 preceding siblings ...) 2025-09-12 11:36 ` [PATCH v2 3/5] dt-bindings: media: remove support of stih407-c8sectpfe Raphael Gallais-Pou @ 2025-09-12 11:36 ` Raphael Gallais-Pou 2025-09-12 14:59 ` Patrice CHOTARD ` (2 more replies) 2025-09-12 11:36 ` [PATCH v2 5/5] dt-bindings: clock: st: flexgen: remove deprecated compatibles Raphael Gallais-Pou 4 siblings, 3 replies; 18+ messages in thread From: Raphael Gallais-Pou @ 2025-09-12 11:36 UTC (permalink / raw) To: Patrice Chotard, Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Michael Turquette, Stephen Boyd Cc: linux-kernel, linux-media, devicetree, linux-clk Following B2120 boards removal in commit dee546e1adef ("ARM: sti: drop B2120 board support"), several compatibles are left unused. Remove them. Signed-off-by: Raphael Gallais-Pou <rgallaispou@gmail.com> --- drivers/clk/st/clk-flexgen.c | 80 -------------------------------------------- 1 file changed, 80 deletions(-) diff --git a/drivers/clk/st/clk-flexgen.c b/drivers/clk/st/clk-flexgen.c index 5292208c4dd8b45edfe7c2722e934dd0299c6d34..e8e7626c76db06b2255908a6658bca1f42600c85 100644 --- a/drivers/clk/st/clk-flexgen.c +++ b/drivers/clk/st/clk-flexgen.c @@ -303,16 +303,6 @@ static const struct clkgen_data clkgen_video = { .mode = 1, }; -static const struct clkgen_clk_out clkgen_stih407_a0_clk_out[] = { - /* This clk needs to be on so that memory interface is accessible */ - { .name = "clk-ic-lmi0", .flags = CLK_IS_CRITICAL }, -}; - -static const struct clkgen_data clkgen_stih407_a0 = { - .outputs = clkgen_stih407_a0_clk_out, - .outputs_nb = ARRAY_SIZE(clkgen_stih407_a0_clk_out), -}; - static const struct clkgen_clk_out clkgen_stih410_a0_clk_out[] = { /* Those clks need to be on so that memory interface is accessible */ { .name = "clk-ic-lmi0", .flags = CLK_IS_CRITICAL }, @@ -324,51 +314,6 @@ static const struct clkgen_data clkgen_stih410_a0 = { .outputs_nb = ARRAY_SIZE(clkgen_stih410_a0_clk_out), }; -static const struct clkgen_clk_out clkgen_stih407_c0_clk_out[] = { - { .name = "clk-icn-gpu", }, - { .name = "clk-fdma", }, - { .name = "clk-nand", }, - { .name = "clk-hva", }, - { .name = "clk-proc-stfe", }, - { .name = "clk-proc-tp", }, - { .name = "clk-rx-icn-dmu", }, - { .name = "clk-rx-icn-hva", }, - /* This clk needs to be on to keep bus interconnect alive */ - { .name = "clk-icn-cpu", .flags = CLK_IS_CRITICAL }, - /* This clk needs to be on to keep bus interconnect alive */ - { .name = "clk-tx-icn-dmu", .flags = CLK_IS_CRITICAL }, - { .name = "clk-mmc-0", }, - { .name = "clk-mmc-1", }, - { .name = "clk-jpegdec", }, - /* This clk needs to be on to keep A9 running */ - { .name = "clk-ext2fa9", .flags = CLK_IS_CRITICAL }, - { .name = "clk-ic-bdisp-0", }, - { .name = "clk-ic-bdisp-1", }, - { .name = "clk-pp-dmu", }, - { .name = "clk-vid-dmu", }, - { .name = "clk-dss-lpc", }, - { .name = "clk-st231-aud-0", }, - { .name = "clk-st231-gp-1", }, - { .name = "clk-st231-dmu", }, - /* This clk needs to be on to keep bus interconnect alive */ - { .name = "clk-icn-lmi", .flags = CLK_IS_CRITICAL }, - { .name = "clk-tx-icn-disp-1", }, - /* This clk needs to be on to keep bus interconnect alive */ - { .name = "clk-icn-sbc", .flags = CLK_IS_CRITICAL }, - { .name = "clk-stfe-frc2", }, - { .name = "clk-eth-phy", }, - { .name = "clk-eth-ref-phyclk", }, - { .name = "clk-flash-promip", }, - { .name = "clk-main-disp", }, - { .name = "clk-aux-disp", }, - { .name = "clk-compo-dvp", }, -}; - -static const struct clkgen_data clkgen_stih407_c0 = { - .outputs = clkgen_stih407_c0_clk_out, - .outputs_nb = ARRAY_SIZE(clkgen_stih407_c0_clk_out), -}; - static const struct clkgen_clk_out clkgen_stih410_c0_clk_out[] = { { .name = "clk-icn-gpu", }, { .name = "clk-fdma", }, @@ -482,19 +427,6 @@ static const struct clkgen_data clkgen_stih418_c0 = { .outputs_nb = ARRAY_SIZE(clkgen_stih418_c0_clk_out), }; -static const struct clkgen_clk_out clkgen_stih407_d0_clk_out[] = { - { .name = "clk-pcm-0", }, - { .name = "clk-pcm-1", }, - { .name = "clk-pcm-2", }, - { .name = "clk-spdiff", }, -}; - -static const struct clkgen_data clkgen_stih407_d0 = { - .flags = CLK_SET_RATE_PARENT, - .outputs = clkgen_stih407_d0_clk_out, - .outputs_nb = ARRAY_SIZE(clkgen_stih407_d0_clk_out), -}; - static const struct clkgen_clk_out clkgen_stih410_d0_clk_out[] = { { .name = "clk-pcm-0", }, { .name = "clk-pcm-1", }, @@ -596,18 +528,10 @@ static const struct of_device_id flexgen_of_match[] = { .compatible = "st,flexgen-video", .data = &clkgen_video, }, - { - .compatible = "st,flexgen-stih407-a0", - .data = &clkgen_stih407_a0, - }, { .compatible = "st,flexgen-stih410-a0", .data = &clkgen_stih410_a0, }, - { - .compatible = "st,flexgen-stih407-c0", - .data = &clkgen_stih407_c0, - }, { .compatible = "st,flexgen-stih410-c0", .data = &clkgen_stih410_c0, @@ -616,10 +540,6 @@ static const struct of_device_id flexgen_of_match[] = { .compatible = "st,flexgen-stih418-c0", .data = &clkgen_stih418_c0, }, - { - .compatible = "st,flexgen-stih407-d0", - .data = &clkgen_stih407_d0, - }, { .compatible = "st,flexgen-stih410-d0", .data = &clkgen_stih410_d0, -- 2.51.0 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH v2 4/5] clk: st: flexgen: remove unused compatible 2025-09-12 11:36 ` [PATCH v2 4/5] clk: st: flexgen: remove unused compatible Raphael Gallais-Pou @ 2025-09-12 14:59 ` Patrice CHOTARD 2025-09-12 15:03 ` Brian Masney 2025-09-21 16:26 ` Stephen Boyd 2 siblings, 0 replies; 18+ messages in thread From: Patrice CHOTARD @ 2025-09-12 14:59 UTC (permalink / raw) To: Raphael Gallais-Pou, Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Michael Turquette, Stephen Boyd Cc: linux-kernel, linux-media, devicetree, linux-clk On 9/12/25 13:36, Raphael Gallais-Pou wrote: > Following B2120 boards removal in commit dee546e1adef ("ARM: sti: drop > B2120 board support"), several compatibles are left unused. Remove > them. > > Signed-off-by: Raphael Gallais-Pou <rgallaispou@gmail.com> > --- > drivers/clk/st/clk-flexgen.c | 80 -------------------------------------------- > 1 file changed, 80 deletions(-) > > diff --git a/drivers/clk/st/clk-flexgen.c b/drivers/clk/st/clk-flexgen.c > index 5292208c4dd8b45edfe7c2722e934dd0299c6d34..e8e7626c76db06b2255908a6658bca1f42600c85 100644 > --- a/drivers/clk/st/clk-flexgen.c > +++ b/drivers/clk/st/clk-flexgen.c > @@ -303,16 +303,6 @@ static const struct clkgen_data clkgen_video = { > .mode = 1, > }; > > -static const struct clkgen_clk_out clkgen_stih407_a0_clk_out[] = { > - /* This clk needs to be on so that memory interface is accessible */ > - { .name = "clk-ic-lmi0", .flags = CLK_IS_CRITICAL }, > -}; > - > -static const struct clkgen_data clkgen_stih407_a0 = { > - .outputs = clkgen_stih407_a0_clk_out, > - .outputs_nb = ARRAY_SIZE(clkgen_stih407_a0_clk_out), > -}; > - > static const struct clkgen_clk_out clkgen_stih410_a0_clk_out[] = { > /* Those clks need to be on so that memory interface is accessible */ > { .name = "clk-ic-lmi0", .flags = CLK_IS_CRITICAL }, > @@ -324,51 +314,6 @@ static const struct clkgen_data clkgen_stih410_a0 = { > .outputs_nb = ARRAY_SIZE(clkgen_stih410_a0_clk_out), > }; > > -static const struct clkgen_clk_out clkgen_stih407_c0_clk_out[] = { > - { .name = "clk-icn-gpu", }, > - { .name = "clk-fdma", }, > - { .name = "clk-nand", }, > - { .name = "clk-hva", }, > - { .name = "clk-proc-stfe", }, > - { .name = "clk-proc-tp", }, > - { .name = "clk-rx-icn-dmu", }, > - { .name = "clk-rx-icn-hva", }, > - /* This clk needs to be on to keep bus interconnect alive */ > - { .name = "clk-icn-cpu", .flags = CLK_IS_CRITICAL }, > - /* This clk needs to be on to keep bus interconnect alive */ > - { .name = "clk-tx-icn-dmu", .flags = CLK_IS_CRITICAL }, > - { .name = "clk-mmc-0", }, > - { .name = "clk-mmc-1", }, > - { .name = "clk-jpegdec", }, > - /* This clk needs to be on to keep A9 running */ > - { .name = "clk-ext2fa9", .flags = CLK_IS_CRITICAL }, > - { .name = "clk-ic-bdisp-0", }, > - { .name = "clk-ic-bdisp-1", }, > - { .name = "clk-pp-dmu", }, > - { .name = "clk-vid-dmu", }, > - { .name = "clk-dss-lpc", }, > - { .name = "clk-st231-aud-0", }, > - { .name = "clk-st231-gp-1", }, > - { .name = "clk-st231-dmu", }, > - /* This clk needs to be on to keep bus interconnect alive */ > - { .name = "clk-icn-lmi", .flags = CLK_IS_CRITICAL }, > - { .name = "clk-tx-icn-disp-1", }, > - /* This clk needs to be on to keep bus interconnect alive */ > - { .name = "clk-icn-sbc", .flags = CLK_IS_CRITICAL }, > - { .name = "clk-stfe-frc2", }, > - { .name = "clk-eth-phy", }, > - { .name = "clk-eth-ref-phyclk", }, > - { .name = "clk-flash-promip", }, > - { .name = "clk-main-disp", }, > - { .name = "clk-aux-disp", }, > - { .name = "clk-compo-dvp", }, > -}; > - > -static const struct clkgen_data clkgen_stih407_c0 = { > - .outputs = clkgen_stih407_c0_clk_out, > - .outputs_nb = ARRAY_SIZE(clkgen_stih407_c0_clk_out), > -}; > - > static const struct clkgen_clk_out clkgen_stih410_c0_clk_out[] = { > { .name = "clk-icn-gpu", }, > { .name = "clk-fdma", }, > @@ -482,19 +427,6 @@ static const struct clkgen_data clkgen_stih418_c0 = { > .outputs_nb = ARRAY_SIZE(clkgen_stih418_c0_clk_out), > }; > > -static const struct clkgen_clk_out clkgen_stih407_d0_clk_out[] = { > - { .name = "clk-pcm-0", }, > - { .name = "clk-pcm-1", }, > - { .name = "clk-pcm-2", }, > - { .name = "clk-spdiff", }, > -}; > - > -static const struct clkgen_data clkgen_stih407_d0 = { > - .flags = CLK_SET_RATE_PARENT, > - .outputs = clkgen_stih407_d0_clk_out, > - .outputs_nb = ARRAY_SIZE(clkgen_stih407_d0_clk_out), > -}; > - > static const struct clkgen_clk_out clkgen_stih410_d0_clk_out[] = { > { .name = "clk-pcm-0", }, > { .name = "clk-pcm-1", }, > @@ -596,18 +528,10 @@ static const struct of_device_id flexgen_of_match[] = { > .compatible = "st,flexgen-video", > .data = &clkgen_video, > }, > - { > - .compatible = "st,flexgen-stih407-a0", > - .data = &clkgen_stih407_a0, > - }, > { > .compatible = "st,flexgen-stih410-a0", > .data = &clkgen_stih410_a0, > }, > - { > - .compatible = "st,flexgen-stih407-c0", > - .data = &clkgen_stih407_c0, > - }, > { > .compatible = "st,flexgen-stih410-c0", > .data = &clkgen_stih410_c0, > @@ -616,10 +540,6 @@ static const struct of_device_id flexgen_of_match[] = { > .compatible = "st,flexgen-stih418-c0", > .data = &clkgen_stih418_c0, > }, > - { > - .compatible = "st,flexgen-stih407-d0", > - .data = &clkgen_stih407_d0, > - }, > { > .compatible = "st,flexgen-stih410-d0", > .data = &clkgen_stih410_d0, > Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com> Thanks Patrice ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 4/5] clk: st: flexgen: remove unused compatible 2025-09-12 11:36 ` [PATCH v2 4/5] clk: st: flexgen: remove unused compatible Raphael Gallais-Pou 2025-09-12 14:59 ` Patrice CHOTARD @ 2025-09-12 15:03 ` Brian Masney 2025-09-21 16:26 ` Stephen Boyd 2 siblings, 0 replies; 18+ messages in thread From: Brian Masney @ 2025-09-12 15:03 UTC (permalink / raw) To: Raphael Gallais-Pou Cc: Patrice Chotard, Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Michael Turquette, Stephen Boyd, linux-kernel, linux-media, devicetree, linux-clk On Fri, Sep 12, 2025 at 01:36:11PM +0200, Raphael Gallais-Pou wrote: > Following B2120 boards removal in commit dee546e1adef ("ARM: sti: drop > B2120 board support"), several compatibles are left unused. Remove > them. > > Signed-off-by: Raphael Gallais-Pou <rgallaispou@gmail.com> Reviewed-by: Brian Masney <bmasney@redhat.com> ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 4/5] clk: st: flexgen: remove unused compatible 2025-09-12 11:36 ` [PATCH v2 4/5] clk: st: flexgen: remove unused compatible Raphael Gallais-Pou 2025-09-12 14:59 ` Patrice CHOTARD 2025-09-12 15:03 ` Brian Masney @ 2025-09-21 16:26 ` Stephen Boyd 2 siblings, 0 replies; 18+ messages in thread From: Stephen Boyd @ 2025-09-21 16:26 UTC (permalink / raw) To: Conor Dooley, Krzysztof Kozlowski, Mauro Carvalho Chehab, Michael Turquette, Patrice Chotard, Raphael Gallais-Pou, Rob Herring Cc: linux-kernel, linux-media, devicetree, linux-clk Quoting Raphael Gallais-Pou (2025-09-12 04:36:11) > Following B2120 boards removal in commit dee546e1adef ("ARM: sti: drop > B2120 board support"), several compatibles are left unused. Remove > them. > > Signed-off-by: Raphael Gallais-Pou <rgallaispou@gmail.com> > --- Applied to clk-next ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v2 5/5] dt-bindings: clock: st: flexgen: remove deprecated compatibles 2025-09-12 11:36 [PATCH v2 0/5] STi drivers cleanup Raphael Gallais-Pou ` (3 preceding siblings ...) 2025-09-12 11:36 ` [PATCH v2 4/5] clk: st: flexgen: remove unused compatible Raphael Gallais-Pou @ 2025-09-12 11:36 ` Raphael Gallais-Pou 2025-09-12 15:04 ` Brian Masney ` (3 more replies) 4 siblings, 4 replies; 18+ messages in thread From: Raphael Gallais-Pou @ 2025-09-12 11:36 UTC (permalink / raw) To: Patrice Chotard, Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Michael Turquette, Stephen Boyd Cc: linux-kernel, linux-media, devicetree, linux-clk st/stih407-clock.dtsi file has been removed in commit 65322c1daf51 ("clk: st: flexgen: remove unused compatible"). This file has three compatibles which are now dangling. Remove them from documentation. Signed-off-by: Raphael Gallais-Pou <rgallaispou@gmail.com> --- Documentation/devicetree/bindings/clock/st/st,flexgen.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/Documentation/devicetree/bindings/clock/st/st,flexgen.txt b/Documentation/devicetree/bindings/clock/st/st,flexgen.txt index c918075405babb99a8f930f4a4430f57269417af..a9d1c19f30a3366c2ec86b6fe84e412b4b41ea56 100644 --- a/Documentation/devicetree/bindings/clock/st/st,flexgen.txt +++ b/Documentation/devicetree/bindings/clock/st/st,flexgen.txt @@ -64,12 +64,9 @@ Required properties: audio use case) "st,flexgen-video", "st,flexgen" (enable clock propagation on parent and activate synchronous mode) - "st,flexgen-stih407-a0" "st,flexgen-stih410-a0" - "st,flexgen-stih407-c0" "st,flexgen-stih410-c0" "st,flexgen-stih418-c0" - "st,flexgen-stih407-d0" "st,flexgen-stih410-d0" "st,flexgen-stih407-d2" "st,flexgen-stih418-d2" -- 2.51.0 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH v2 5/5] dt-bindings: clock: st: flexgen: remove deprecated compatibles 2025-09-12 11:36 ` [PATCH v2 5/5] dt-bindings: clock: st: flexgen: remove deprecated compatibles Raphael Gallais-Pou @ 2025-09-12 15:04 ` Brian Masney 2025-09-12 15:20 ` Patrice CHOTARD ` (2 subsequent siblings) 3 siblings, 0 replies; 18+ messages in thread From: Brian Masney @ 2025-09-12 15:04 UTC (permalink / raw) To: Raphael Gallais-Pou Cc: Patrice Chotard, Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Michael Turquette, Stephen Boyd, linux-kernel, linux-media, devicetree, linux-clk On Fri, Sep 12, 2025 at 01:36:12PM +0200, Raphael Gallais-Pou wrote: > st/stih407-clock.dtsi file has been removed in commit 65322c1daf51 > ("clk: st: flexgen: remove unused compatible"). This file has three > compatibles which are now dangling. Remove them from documentation. > > Signed-off-by: Raphael Gallais-Pou <rgallaispou@gmail.com> Reviewed-by: Brian Masney <bmasney@redhat.com> ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 5/5] dt-bindings: clock: st: flexgen: remove deprecated compatibles 2025-09-12 11:36 ` [PATCH v2 5/5] dt-bindings: clock: st: flexgen: remove deprecated compatibles Raphael Gallais-Pou 2025-09-12 15:04 ` Brian Masney @ 2025-09-12 15:20 ` Patrice CHOTARD 2025-09-15 21:28 ` Rob Herring (Arm) 2025-09-21 16:27 ` Stephen Boyd 3 siblings, 0 replies; 18+ messages in thread From: Patrice CHOTARD @ 2025-09-12 15:20 UTC (permalink / raw) To: Raphael Gallais-Pou, Mauro Carvalho Chehab, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Michael Turquette, Stephen Boyd Cc: linux-kernel, linux-media, devicetree, linux-clk On 9/12/25 13:36, Raphael Gallais-Pou wrote: > st/stih407-clock.dtsi file has been removed in commit 65322c1daf51 > ("clk: st: flexgen: remove unused compatible"). This file has three > compatibles which are now dangling. Remove them from documentation. > > Signed-off-by: Raphael Gallais-Pou <rgallaispou@gmail.com> > --- > Documentation/devicetree/bindings/clock/st/st,flexgen.txt | 3 --- > 1 file changed, 3 deletions(-) > > diff --git a/Documentation/devicetree/bindings/clock/st/st,flexgen.txt b/Documentation/devicetree/bindings/clock/st/st,flexgen.txt > index c918075405babb99a8f930f4a4430f57269417af..a9d1c19f30a3366c2ec86b6fe84e412b4b41ea56 100644 > --- a/Documentation/devicetree/bindings/clock/st/st,flexgen.txt > +++ b/Documentation/devicetree/bindings/clock/st/st,flexgen.txt > @@ -64,12 +64,9 @@ Required properties: > audio use case) > "st,flexgen-video", "st,flexgen" (enable clock propagation on parent > and activate synchronous mode) > - "st,flexgen-stih407-a0" > "st,flexgen-stih410-a0" > - "st,flexgen-stih407-c0" > "st,flexgen-stih410-c0" > "st,flexgen-stih418-c0" > - "st,flexgen-stih407-d0" > "st,flexgen-stih410-d0" > "st,flexgen-stih407-d2" > "st,flexgen-stih418-d2" > Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com> Thanks Patrice ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 5/5] dt-bindings: clock: st: flexgen: remove deprecated compatibles 2025-09-12 11:36 ` [PATCH v2 5/5] dt-bindings: clock: st: flexgen: remove deprecated compatibles Raphael Gallais-Pou 2025-09-12 15:04 ` Brian Masney 2025-09-12 15:20 ` Patrice CHOTARD @ 2025-09-15 21:28 ` Rob Herring (Arm) 2025-09-21 16:27 ` Stephen Boyd 3 siblings, 0 replies; 18+ messages in thread From: Rob Herring (Arm) @ 2025-09-15 21:28 UTC (permalink / raw) To: Raphael Gallais-Pou Cc: linux-kernel, Michael Turquette, Mauro Carvalho Chehab, Krzysztof Kozlowski, devicetree, linux-clk, linux-media, Conor Dooley, Patrice Chotard, Stephen Boyd On Fri, 12 Sep 2025 13:36:12 +0200, Raphael Gallais-Pou wrote: > st/stih407-clock.dtsi file has been removed in commit 65322c1daf51 > ("clk: st: flexgen: remove unused compatible"). This file has three > compatibles which are now dangling. Remove them from documentation. > > Signed-off-by: Raphael Gallais-Pou <rgallaispou@gmail.com> > --- > Documentation/devicetree/bindings/clock/st/st,flexgen.txt | 3 --- > 1 file changed, 3 deletions(-) > Acked-by: Rob Herring (Arm) <robh@kernel.org> ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 5/5] dt-bindings: clock: st: flexgen: remove deprecated compatibles 2025-09-12 11:36 ` [PATCH v2 5/5] dt-bindings: clock: st: flexgen: remove deprecated compatibles Raphael Gallais-Pou ` (2 preceding siblings ...) 2025-09-15 21:28 ` Rob Herring (Arm) @ 2025-09-21 16:27 ` Stephen Boyd 3 siblings, 0 replies; 18+ messages in thread From: Stephen Boyd @ 2025-09-21 16:27 UTC (permalink / raw) To: Conor Dooley, Krzysztof Kozlowski, Mauro Carvalho Chehab, Michael Turquette, Patrice Chotard, Raphael Gallais-Pou, Rob Herring Cc: linux-kernel, linux-media, devicetree, linux-clk Quoting Raphael Gallais-Pou (2025-09-12 04:36:12) > st/stih407-clock.dtsi file has been removed in commit 65322c1daf51 > ("clk: st: flexgen: remove unused compatible"). This file has three > compatibles which are now dangling. Remove them from documentation. > > Signed-off-by: Raphael Gallais-Pou <rgallaispou@gmail.com> > --- Applied to clk-next ^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2025-09-21 16:27 UTC | newest] Thread overview: 18+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-09-12 11:36 [PATCH v2 0/5] STi drivers cleanup Raphael Gallais-Pou 2025-09-12 11:36 ` [PATCH v2 1/5] media: c8sectpfe: remove support of STi c8sectpfe driver Raphael Gallais-Pou 2025-09-12 14:24 ` Patrice CHOTARD 2025-09-12 11:36 ` [PATCH v2 2/5] media: include: remove c8sectpfe header Raphael Gallais-Pou 2025-09-12 14:28 ` Patrice CHOTARD 2025-09-15 21:25 ` Rob Herring (Arm) 2025-09-12 11:36 ` [PATCH v2 3/5] dt-bindings: media: remove support of stih407-c8sectpfe Raphael Gallais-Pou 2025-09-12 14:31 ` Patrice CHOTARD 2025-09-15 21:26 ` Rob Herring (Arm) 2025-09-12 11:36 ` [PATCH v2 4/5] clk: st: flexgen: remove unused compatible Raphael Gallais-Pou 2025-09-12 14:59 ` Patrice CHOTARD 2025-09-12 15:03 ` Brian Masney 2025-09-21 16:26 ` Stephen Boyd 2025-09-12 11:36 ` [PATCH v2 5/5] dt-bindings: clock: st: flexgen: remove deprecated compatibles Raphael Gallais-Pou 2025-09-12 15:04 ` Brian Masney 2025-09-12 15:20 ` Patrice CHOTARD 2025-09-15 21:28 ` Rob Herring (Arm) 2025-09-21 16:27 ` Stephen Boyd
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox