From nobody Thu Oct 2 06:16:48 2025 Received: from mail-pg1-f171.google.com (mail-pg1-f171.google.com [209.85.215.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 066C7EEDE for ; Sun, 21 Sep 2025 19:02:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758481327; cv=none; b=SS62hAji+N5PhAlNVTQ1VOvZAMwgectjjyoNP9ZHr8AtusHIF1Xe4yMRJdv82HY8fgSAr1uM34xuVBBpxTfXBaZoB8k6yJHaDf2twj2YcA1S2EoAnjwruzhXYAEYxDGg4Atwr4WMvY7t4p7JS3mw3mLc62+ji9yaxRTN/wawbvM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758481327; c=relaxed/simple; bh=MGtwA1ORP1SZWS3yFHFC1So7GPy8+TI3Y+7Wnm9Gi94=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=vAe3ChToNUoGjOEUge9e+dw0KZW349o3sXtK+1OlCP3dZOVMBWmbRFop9ZuCkBCONrddRpUpJiPAM7LQSHI7SX7URcze2/nEFMJQn2v8G7Zm8sP1siGRvElF0t7wLLMATlNxZfZPEbuLWuT7kvQ+ptIMH3JrmDTcDmRq/12nPgs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=F3jeGt7v; arc=none smtp.client-ip=209.85.215.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="F3jeGt7v" Received: by mail-pg1-f171.google.com with SMTP id 41be03b00d2f7-b4c29d2ea05so3464833a12.0 for ; Sun, 21 Sep 2025 12:02:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758481325; x=1759086125; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=trXhhaVo1V956DTPgVzHkWvjZXBUgzeYR4SoTGMR0QE=; b=F3jeGt7vGf3VEutZfkQ65VNbD9YVuwbF4jRerqwXees+aXKKqzBqBnW+xSBN3oLInu 5aHqb4WblEaHqBBxz/xQzp1YlL7Es4ujpVu1RXyLvj1vjgZi6RM02OGTycGlBpJ0N13m mweb8QEdaebAHKS3THK53Q3NCrLoW0iBGg2ODQf7d7CZiDVpIaJFYj+DXOfnF2Q0ZrXB z9Wn0ve2fsXYQlfGwlo/ii3A/j3YrdWcHAzDhbcHU6uTpB9l9mkYvw5C0mz1EKDSUeGZ sNfdgKzXB39heBDr/UpQBVE6VXZPVyrJDgU1ISULqEKA82LrSvSp7PT15igExXBE+IfT ijvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758481325; x=1759086125; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=trXhhaVo1V956DTPgVzHkWvjZXBUgzeYR4SoTGMR0QE=; b=qn4IhurmP9Wo9yOUx8sTt6g+L5qsZR+V/w7TqF/PFbJB7l0daCeTzTxuJAlzDCpdDl bbnZWVOZo4Uy+8vaUbyXB4rxGT/qlLwR9M5YvaoL/oktEnONmqubP/4l4x2IL9/GrFFI o1OmPXUgGIzg0+vqasEJMYsI9m6GP9mCBc51ac+CivoP732TajV6MtHZVez9Li5SwoFa w34FpNgWISfOAGJk0hKwzUrsAJXtvkq4Cr/+IYo6+XvJa4mdwjwVjJolO+hiz9TkJZg+ jH91KO/xQxDro4wlPsUo+IbAUGKTzOyq1at46uBPNFTqBjx5x4VclcHAACgB/+LG/IR6 Y+rQ== X-Gm-Message-State: AOJu0Yw7NPf2gZ35Y798bnZG+RMrDKGCyXIkb7wiPOnOWSo9AO0a4o51 ibjz6wkaQcAYNLzadzyJcnMdi0/aQ8mpck4kzSHboCEi3ONaRekPdoys X-Gm-Gg: ASbGncvhvsW4bO8BHSyFDBz2i/tB293DCdXE6JYRGG2wqd6t7l28T23qug3zfS17VGH QQOB2BwosO9/fnI8I2ufatQDV88+P7fIQi/e6W40EFJ8jQiP8W97gA1gNiq1v1+CbHZHfuEyZys fEuMml5s0x3L7eAhywYvMfZT12rxsp0sMEYdTOdvHwes6qv5hQlGuNRW02VB9Ntd0rZgo94bVGb cB6vtOc4fsfq52uT1mo/A9AUFLNEEyijfmGWweGVMPC7E/OpzURuye8qUkhlrBM+0P1QQ+WMBqt ILm7HSJj6uuQRNtdM9MT7MxmTCLqbVctT3oLzcaMaX+AOG9PstQrmGO8mb3Z63rCkbHVk2B+JqT T+O4JR5UZD4VEMtH3GuCOYbaXEfYBa1iLmw== X-Google-Smtp-Source: AGHT+IGjix9Q3SsImAjWNlj3eDVMBvG9InLq50vg9siHUGNZyuZAe8aBBpMUA8CYYa0XVd+x30ifeQ== X-Received: by 2002:a17:902:ecc3:b0:26c:4280:4860 with SMTP id d9443c01a7336-26c42804be8mr114393475ad.8.1758481325075; Sun, 21 Sep 2025 12:02:05 -0700 (PDT) Received: from fedora ([172.59.162.206]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2699ae52db1sm99784565ad.43.2025.09.21.12.02.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 21 Sep 2025 12:02:04 -0700 (PDT) From: Alex Tran To: linux-media@vger.kernel.org Cc: linux-kernel@vger.kernel.org, mchehab@kernel.org, hverkuil+cisco@kernel.org, hansg@kernel.org, ribalda@chromium.org, laurent.pinchart@ideasonboard.com, cascardo@igalia.com, Alex Tran Subject: [PATCH v4] media: i2c: wm8775: parameterize wm8775_platform_data based on config Date: Sun, 21 Sep 2025 12:01:55 -0700 Message-ID: <20250921190155.1013277-1-alex.t.tran@gmail.com> X-Mailer: git-send-email 2.51.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Parameterized wm8775_platform_data struct, removing the single boolean for determining device type. wm8775_standard_cfg struct will be used for standard devices and wm8775_nova_s_cfg for nova_s devices.=20 Signed-off-by: Alex Tran --- Changes in v2: - rebased from mchehab linux media onto media committers tree - resolve patch and build errors Changes in v3: - cc updated maintainers list Changes in v4: - exported config symbols - cx88_core wm8775_data field converted to pointer drivers/media/i2c/wm8775.c | 111 ++++++++++++++++------------ drivers/media/pci/cx88/cx88-video.c | 6 +- drivers/media/pci/cx88/cx88.h | 2 +- include/media/i2c/wm8775.h | 25 +++++-- 4 files changed, 87 insertions(+), 57 deletions(-) diff --git a/drivers/media/i2c/wm8775.c b/drivers/media/i2c/wm8775.c index 56778d3bc..a6c605303 100644 --- a/drivers/media/i2c/wm8775.c +++ b/drivers/media/i2c/wm8775.c @@ -50,6 +50,45 @@ struct wm8775_state { u8 input; /* Last selected input (0-0xf) */ }; =20 +struct wm8775_platform_data wm8775_standard_cfg =3D { + .reset =3D 0x000, /* RESET */ + .zero_cross_timeout =3D 0x000, /* Disable zero cross detect timeout */ + .interface_ctrl =3D + 0x021, /* HPF enable, left justified, 24-bit (Philips) mode */ + .master_mode =3D 0x102, /* Master mode, clock ratio 256fs */ + .powerdown =3D 0x000, /* Powered up */ + .adc_l =3D 0x1d4, /* ADC gain +2.5dB, enable zero cross */ + .adc_r =3D 0x1d4, /* ADC gain +2.5dB, enable zero cross */ + .alc_ctrl_1 =3D + 0x1bf, /* ALC Stereo, ALC target level -1dB FS max gain +8dB */ + .alc_ctrl_2 =3D 0x185, /* Enable gain control, ALC hold time 42.6 ms */ + .alc_ctrl_3 =3D 0x0a2, /* Ramp up delay 34 s, ramp down delay 33 ms */ + .noise_gate =3D 0x005, /* Enable noise gate, threshold -72dBfs */ + .limiter_ctrl =3D 0x07a, /* Window 4ms, lower PGA gain limit -1dB */ + .adc_mixer =3D 0x102, /* LRBOTH =3D 1, use input 2. */ + .should_set_audio =3D false, +}; +EXPORT_SYMBOL_GPL(wm8775_standard_cfg); + +struct wm8775_platform_data wm8775_nova_s_cfg =3D { + .reset =3D 0x000, /* RESET */ + .zero_cross_timeout =3D 0x000, /* Disable zero cross detect timeout */ + .interface_ctrl =3D + 0x021, /* HPF enable, left justified, 24-bit (Philips) mode */ + .master_mode =3D 0x102, /* Master mode, clock ratio 256fs */ + .powerdown =3D 0x000, /* Powered up */ + .adc_l =3D WM8775_REG_UNUSED, + .adc_r =3D WM8775_REG_UNUSED, + .alc_ctrl_1 =3D 0x1bb, /* Stereo, target level -5dB FS, max gain +8dB */ + .alc_ctrl_2 =3D WM8775_REG_UNUSED, + .alc_ctrl_3 =3D 0x0a2, /* Ramp up delay 34 s, ramp down delay 33 ms */ + .noise_gate =3D 0x005, /* Enable noise gate, threshold -72dBfs */ + .limiter_ctrl =3D 0x0fb, /* Transient window 4ms, ALC min gain -5dB */ + .adc_mixer =3D WM8775_REG_UNUSED, + .should_set_audio =3D true, /* set volume/mute/mux */ +}; +EXPORT_SYMBOL_GPL(wm8775_nova_s_cfg); + static inline struct wm8775_state *to_state(struct v4l2_subdev *sd) { return container_of(sd, struct wm8775_state, sd); @@ -195,12 +234,8 @@ static int wm8775_probe(struct i2c_client *client) struct wm8775_state *state; struct v4l2_subdev *sd; int err; - bool is_nova_s =3D false; - - if (client->dev.platform_data) { - struct wm8775_platform_data *data =3D client->dev.platform_data; - is_nova_s =3D data->is_nova_s; - } + struct wm8775_platform_data *data =3D client->dev.platform_data ?: + &wm8775_standard_cfg; =20 /* Check if the adapter supports the needed features */ if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) @@ -233,49 +268,29 @@ static int wm8775_probe(struct i2c_client *client) } =20 /* Initialize wm8775 */ + wm8775_write(sd, R23, data->reset); + wm8775_write(sd, R7, data->zero_cross_timeout); + wm8775_write(sd, R11, data->interface_ctrl); + wm8775_write(sd, R12, data->master_mode); + wm8775_write(sd, R13, data->powerdown); + if (data->adc_l !=3D WM8775_REG_UNUSED) + wm8775_write(sd, R14, data->adc_l); + if (data->adc_r !=3D WM8775_REG_UNUSED) + wm8775_write(sd, R15, data->adc_r); + wm8775_write(sd, R16, data->alc_ctrl_1); + if (data->alc_ctrl_2 !=3D WM8775_REG_UNUSED) + wm8775_write(sd, R17, data->alc_ctrl_2); + else + wm8775_write(sd, R17, + (state->loud->val ? ALC_EN : 0) | ALC_HOLD); + wm8775_write(sd, R18, data->alc_ctrl_3); + wm8775_write(sd, R19, data->noise_gate); + wm8775_write(sd, R20, data->limiter_ctrl); + if (data->adc_mixer !=3D WM8775_REG_UNUSED) + wm8775_write(sd, R21, data->adc_mixer); + if (data->should_set_audio) + wm8775_set_audio(sd, 1); =20 - /* RESET */ - wm8775_write(sd, R23, 0x000); - /* Disable zero cross detect timeout */ - wm8775_write(sd, R7, 0x000); - /* HPF enable, left justified, 24-bit (Philips) mode */ - wm8775_write(sd, R11, 0x021); - /* Master mode, clock ratio 256fs */ - wm8775_write(sd, R12, 0x102); - /* Powered up */ - wm8775_write(sd, R13, 0x000); - - if (!is_nova_s) { - /* ADC gain +2.5dB, enable zero cross */ - wm8775_write(sd, R14, 0x1d4); - /* ADC gain +2.5dB, enable zero cross */ - wm8775_write(sd, R15, 0x1d4); - /* ALC Stereo, ALC target level -1dB FS max gain +8dB */ - wm8775_write(sd, R16, 0x1bf); - /* Enable gain control, use zero cross detection, - ALC hold time 42.6 ms */ - wm8775_write(sd, R17, 0x185); - } else { - /* ALC stereo, ALC target level -5dB FS, ALC max gain +8dB */ - wm8775_write(sd, R16, 0x1bb); - /* Set ALC mode and hold time */ - wm8775_write(sd, R17, (state->loud->val ? ALC_EN : 0) | ALC_HOLD); - } - /* ALC gain ramp up delay 34 s, ALC gain ramp down delay 33 ms */ - wm8775_write(sd, R18, 0x0a2); - /* Enable noise gate, threshold -72dBfs */ - wm8775_write(sd, R19, 0x005); - if (!is_nova_s) { - /* Transient window 4ms, lower PGA gain limit -1dB */ - wm8775_write(sd, R20, 0x07a); - /* LRBOTH =3D 1, use input 2. */ - wm8775_write(sd, R21, 0x102); - } else { - /* Transient window 4ms, ALC min gain -5dB */ - wm8775_write(sd, R20, 0x0fb); - - wm8775_set_audio(sd, 1); /* set volume/mute/mux */ - } return 0; } =20 diff --git a/drivers/media/pci/cx88/cx88-video.c b/drivers/media/pci/cx88/c= x88-video.c index 0c8732768..2054daeba 100644 --- a/drivers/media/pci/cx88/cx88-video.c +++ b/drivers/media/pci/cx88/cx88-video.c @@ -1348,14 +1348,14 @@ static int cx8800_initdev(struct pci_dev *pci_dev, struct i2c_board_info wm8775_info =3D { .type =3D "wm8775", .addr =3D 0x36 >> 1, - .platform_data =3D &core->wm8775_data, + .platform_data =3D core->wm8775_data, }; struct v4l2_subdev *sd; =20 if (core->boardnr =3D=3D CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1) - core->wm8775_data.is_nova_s =3D true; + core->wm8775_data =3D &wm8775_nova_s_cfg; else - core->wm8775_data.is_nova_s =3D false; + core->wm8775_data =3D &wm8775_standard_cfg; =20 sd =3D v4l2_i2c_new_subdev_board(&core->v4l2_dev, &core->i2c_adap, &wm8775_info, NULL); diff --git a/drivers/media/pci/cx88/cx88.h b/drivers/media/pci/cx88/cx88.h index 2ff3226a5..c8f85d2f4 100644 --- a/drivers/media/pci/cx88/cx88.h +++ b/drivers/media/pci/cx88/cx88.h @@ -391,7 +391,7 @@ struct cx88_core { =20 /* I2C remote data */ struct IR_i2c_init_data init_data; - struct wm8775_platform_data wm8775_data; + struct wm8775_platform_data *wm8775_data; =20 struct mutex lock; /* various v4l controls */ diff --git a/include/media/i2c/wm8775.h b/include/media/i2c/wm8775.h index a02695ee3..99678d165 100644 --- a/include/media/i2c/wm8775.h +++ b/include/media/i2c/wm8775.h @@ -20,13 +20,28 @@ #define WM8775_AIN3 4 #define WM8775_AIN4 8 =20 +#define WM8775_REG_UNUSED ((u16)-1) =20 struct wm8775_platform_data { - /* - * FIXME: Instead, we should parameterize the params - * that need different settings between ivtv, pvrusb2, and Nova-S - */ - bool is_nova_s; + u16 reset; /* RESET (R23) */ + u16 zero_cross_timeout; /* Zero cross detect timeout (R7) */ + u16 interface_ctrl; /* Interface control (R11) */ + u16 master_mode; /* Master mode (R12) */ + u16 powerdown; /* Power down (R13) */ + + u16 adc_l; /* ADC left (R14) */ + u16 adc_r; /* ADC right (R15) */ + u16 alc_ctrl_1; /* ALC control 1 (R16)*/ + u16 alc_ctrl_2; /* ALC control 2 (R17) */ + u16 alc_ctrl_3; /* ALC control 3 (R18) */ + u16 noise_gate; /* Noise gate (R19) */ + u16 limiter_ctrl; /* Limiter control (R20) */ + u16 adc_mixer; /* ADC mixer control (R21) */ + + bool should_set_audio; }; =20 +extern struct wm8775_platform_data wm8775_nova_s_cfg; +extern struct wm8775_platform_data wm8775_standard_cfg; + #endif --=20 2.51.0