From: Bradford Love Date: Tue, 17 Mar 2026 21:49:02 +0000 (-0500) Subject: media: cx23885: Module option to disable analog video X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=08b34f01a9fa6d181d9cf68205aed0799bf98b0d;p=thirdparty%2Fkernel%2Fstable.git media: cx23885: Module option to disable analog video Initialized and left to themselves some boards with analog inputs, on some modern platforms can throw critical errors which prevents even digital from working thereafter. If analog is never used this module parameter allows analog to be disabled on a card by card basis. It is already possible to disable analog audio. For example, to disable for Hauppauge QuadHD with analog functionality: options cx23885 disable_analog_video=56,57 can be placed insode of /etc/modprobe.d/cx23885.conf Signed-off-by: Bradford Love Signed-off-by: Hans Verkuil --- diff --git a/drivers/media/pci/cx23885/cx23885-cards.c b/drivers/media/pci/cx23885/cx23885-cards.c index da23e7dfeef5..95a84709d5a6 100644 --- a/drivers/media/pci/cx23885/cx23885-cards.c +++ b/drivers/media/pci/cx23885/cx23885-cards.c @@ -2443,6 +2443,9 @@ void cx23885_card_setup(struct cx23885_dev *dev) case CX23885_BOARD_VIEWCAST_460E: case CX23885_BOARD_AVERMEDIA_CE310B: case CX23885_BOARD_AVERMEDIA_H789C: + if (dev->disable_analog) + break; + dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_bus[2].i2c_adap, "cx25840", 0x88 >> 1, NULL); diff --git a/drivers/media/pci/cx23885/cx23885-core.c b/drivers/media/pci/cx23885/cx23885-core.c index 0892a5fd137d..4a8af8b88d84 100644 --- a/drivers/media/pci/cx23885/cx23885-core.c +++ b/drivers/media/pci/cx23885/cx23885-core.c @@ -48,6 +48,11 @@ static unsigned int debug; module_param(debug, int, 0644); MODULE_PARM_DESC(debug, "enable debug messages"); +static unsigned int disable_analog_video[8] = { 0, 0, 0, 0, 0, 0, 0, 0}; +static int disable_analog_argc; +module_param_array(disable_analog_video, int, &disable_analog_argc, 0644); +MODULE_PARM_DESC(disable_analog_video, "disable analog video for card type"); + static unsigned int card[] = {[0 ... (CX23885_MAXBOARDS - 1)] = UNSET }; module_param_array(card, int, NULL, 0444); MODULE_PARM_DESC(card, "card type"); @@ -924,6 +929,13 @@ static int cx23885_dev_setup(struct cx23885_dev *dev) dev->board = CX23885_BOARD_HAUPPAUGE_QUADHD_DVB_885; } + for (i = 0; i < disable_analog_argc; i++) { + if (disable_analog_video[i] == dev->board) { + pr_warn("Disabling analog for board %d\n", dev->board); + dev->disable_analog = 1; + } + } + /* If the user specific a clk freq override, apply it */ if (cx23885_boards[dev->board].clk_freq > 0) dev->clk_freq = cx23885_boards[dev->board].clk_freq; @@ -1043,7 +1055,8 @@ static int cx23885_dev_setup(struct cx23885_dev *dev) cx23885_gpio_enable(dev, 0x300, 0); } - if (cx23885_boards[dev->board].porta == CX23885_ANALOG_VIDEO) { + if (cx23885_boards[dev->board].porta == CX23885_ANALOG_VIDEO && + !dev->disable_analog) { if (cx23885_video_register(dev) < 0) { pr_err("%s() Failed to register analog video adapters on VID_A\n", __func__); diff --git a/drivers/media/pci/cx23885/cx23885-dvb.c b/drivers/media/pci/cx23885/cx23885-dvb.c index 05a7859cbe57..f240ccda40ed 100644 --- a/drivers/media/pci/cx23885/cx23885-dvb.c +++ b/drivers/media/pci/cx23885/cx23885-dvb.c @@ -2373,7 +2373,8 @@ static int dvb_register(struct cx23885_tsport *port) port->i2c_client_tuner = client_tuner; /* we only attach tuner for analog on the 888 version */ - if (dev->board == CX23885_BOARD_HAUPPAUGE_QUADHD_DVB) { + if (dev->board == CX23885_BOARD_HAUPPAUGE_QUADHD_DVB && + !dev->disable_analog) { pr_info("%s(): QUADHD_DVB analog setup\n", __func__); dev->ts1.analog_fe.tuner_priv = client_tuner; @@ -2466,7 +2467,8 @@ static int dvb_register(struct cx23885_tsport *port) port->i2c_client_tuner = client_tuner; /* we only attach tuner for analog on the 888 version */ - if (dev->board == CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC) { + if (dev->board == CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC && + !dev->disable_analog) { pr_info("%s(): QUADHD_ATSC analog setup\n", __func__); dev->ts1.analog_fe.tuner_priv = client_tuner; diff --git a/drivers/media/pci/cx23885/cx23885.h b/drivers/media/pci/cx23885/cx23885.h index 8ba1f306238c..8653ee1d9ba6 100644 --- a/drivers/media/pci/cx23885/cx23885.h +++ b/drivers/media/pci/cx23885/cx23885.h @@ -404,6 +404,7 @@ struct cx23885_dev { unsigned char radio_addr; struct v4l2_subdev *sd_cx25840; struct work_struct cx25840_work; + unsigned int disable_analog; /* Infrared */ struct v4l2_subdev *sd_ir;