Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
164 changes: 164 additions & 0 deletions .github/workflows/dkms-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
name: dkms build

on:
push:
pull_request:

permissions:
contents: read

defaults:
run:
shell: bash

jobs:
ubuntu-dkms:
name: Ubuntu ${{ matrix.os_version }} DKMS (${{ matrix.kernel_family }})
runs-on: ubuntu-latest
container: ubuntu:${{ matrix.os_version }}
env:
DEBIAN_FRONTEND: noninteractive
KERNEL_FAMILY: ${{ matrix.kernel_family }}
strategy:
fail-fast: false
matrix:
include:
- { os_version: '24.04', kernel_family: '6.12-intel' }
- { os_version: '24.04', kernel_family: '6.17-intel' }
- { os_version: '24.04', kernel_family: '6.18-intel' }
- { os_version: '24.04', kernel_family: '6.17' }
- { os_version: '24.04', kernel_family: '7.0' }
- { os_version: '26.04', kernel_family: '7.0' }
steps:
- name: Bootstrap git for checkout
run: |
apt-get update -q
apt-get install -y --no-install-recommends git ca-certificates

- name: Checkout
uses: actions/checkout@v5
with:
submodules: recursive

- name: Prepare environment
run: |
set -euo pipefail

# -intel matrix rows need the public Intel Linux Overlay (01.org).
# Canonical rows use only the Ubuntu default archives.
if [[ "${KERNEL_FAMILY}" == *-intel ]]; then
apt-get install -y --no-install-recommends curl gnupg
curl -fsSL https://download.01.org/intel-linux-overlay/ubuntu/E6FA98203588250569758E97D176E3162086EE4C.gpg \
| gpg --dearmor >/usr/share/keyrings/intel-linux-overlay.gpg
echo 'deb [signed-by=/usr/share/keyrings/intel-linux-overlay.gpg] https://download.01.org/intel-linux-overlay/ubuntu noble main kernels non-free multimedia' \
>/etc/apt/sources.list.d/intel-linux-overlay.list
fi

codename=$(. /etc/os-release && echo "$VERSION_CODENAME")
sed -i "s/${codename}-updates/${codename}-updates ${codename}-proposed/" /etc/apt/sources.list.d/ubuntu.sources
apt-get update -q
apt-get install -y --no-install-recommends \
build-essential ca-certificates curl dkms git kmod patch wget xz-utils

- name: Download header files
env:
OS_VERSION: ${{ matrix.os_version }}
run: |
set -euo pipefail
if [[ "${KERNEL_FAMILY}" == *-intel ]]; then
apt-get install -y "linux-headers-${KERNEL_FAMILY}"
fi
# 24.04 LTS needs HWE-edge / OEM meta-packages for newer kernels.
# 26.04+ ship newer kernels natively via linux-headers-generic.
if [[ "${OS_VERSION}" == "24.04" ]]; then
apt-get install -y \
linux-headers-generic \
linux-headers-generic-hwe-24.04-edge \
linux-headers-oem-24.04a \
linux-headers-oem-24.04b
else
apt-get install -y linux-headers-generic
fi

- name: Compile driver
run: |
set -euo pipefail
expect_intel=0
target_family="${KERNEL_FAMILY}"
if [[ "${KERNEL_FAMILY}" == *-intel ]]; then
expect_intel=1
target_family="${KERNEL_FAMILY%-intel}"
fi
target_regex="^${target_family//./\\.}([-.+].*|[a-z].*)?$"

package_name="$(sed -n 's/^PACKAGE_NAME="\(.*\)"/\1/p' dkms.conf)"
package_version="$(sed -n 's/^PACKAGE_VERSION="\(.*\)"/\1/p' dkms.conf)"
[[ -n "${package_name}" && -n "${package_version}" ]] \
|| { echo "Failed to parse PACKAGE_NAME/PACKAGE_VERSION from dkms.conf" >&2; exit 1; }

# Derive upstream kernel source paths from dkms.conf POST_ADD+= lines
# so this workflow stays in sync when dkms.conf changes.
mapfile -t post_add_paths < <(
awk -F'"' '/^POST_ADD\+=/ {
n = split($2, a, " ")
for (i = 1; i <= n; i++) if (a[i] != "" && !seen[a[i]]++) print a[i]
}' dkms.conf
)
(( ${#post_add_paths[@]} > 0 )) \
|| { echo "Failed to derive post_add_paths from dkms.conf" >&2; exit 1; }
echo "Derived post_add_paths from dkms.conf:"
printf ' %s\n' "${post_add_paths[@]}"

echo "Target kernel family: ${target_family} (expect_intel=${expect_intel})"
matched=0
failed=()

for kdir in /lib/modules/*/build; do
[[ -d "${kdir}" ]] || continue
kver="${kdir%/build}"; kver="${kver##*/}"

if [[ "${kver}" == *azure* ]]; then
echo "Skipping ${kver} (GitHub runner kernel)"; continue
fi
if [[ ! "${kver}" =~ ${target_regex} ]]; then
echo "Skipping ${kver} (family mismatch)"; continue
fi
is_intel=0; [[ "${kver}" == *-intel* ]] && is_intel=1
if (( is_intel != expect_intel )); then
echo "Skipping ${kver} (intel/canonical mismatch)"; continue
fi

(( matched += 1 ))
echo "=== Testing ${kver} ==="
dkms remove -m "${package_name}" -v "${package_version}" --all >/dev/null 2>&1 || true

# Neuter POST_ADD during `dkms add` — we run the source-fetch
# script manually below with the correct kernelver.
cp dkms.conf dkms.conf.ci.bak
sed -i 's|^POST_ADD=.*|POST_ADD="/bin/true"|' dkms.conf
if ! dkms add .; then
failed+=("${kver} (add)")
mv dkms.conf.ci.bak dkms.conf
continue
fi
mv dkms.conf.ci.bak dkms.conf

src="/usr/src/${package_name}-${package_version}"
build="/var/lib/dkms/${package_name}/${package_version}/build"
( cd "${src}" && env kernelver="${kver}" bash ./script/dkms-kernel-source.sh "${post_add_paths[@]}" )
mkdir -p "${build}"
cp -a "${src}/." "${build}/"

echo "running: dkms build -k ${kver}"
dkms build -m "${package_name}" -v "${package_version}" -k "${kver}" || failed+=("${kver}")
done

if (( matched == 0 )); then
echo "#### No installed kernel headers matched target family ${target_family}"
exit 1
fi
if (( ${#failed[@]} > 0 )); then
echo "#### Failed kernels: ${failed[*]}"
exit 1
fi
echo "#### All builds succeeded for target family ${target_family}"
23 changes: 23 additions & 0 deletions drivers/media/i2c/maxim-serdes/max96717.c
Original file line number Diff line number Diff line change
Expand Up @@ -1810,6 +1810,28 @@ static void max96717_remove(struct i2c_client *client)
max_ser_remove(&priv->ser);
}

static int max96717_suspend(struct device *dev)
{
struct max96717_priv *priv = dev_get_drvdata(dev);

return max_ser_suspend(&priv->ser);
}

static int max96717_resume(struct device *dev)
{
struct max96717_priv *priv = dev_get_drvdata(dev);
int ret;

ret = max96717_wait_for_device(priv);
if (ret)
return ret;

return max_ser_resume(&priv->ser);
}

static DEFINE_SIMPLE_DEV_PM_OPS(max96717_pm_ops,
max96717_suspend, max96717_resume);

static const struct max96717_chip_info max9295a_info = {
.ops = &max96717_common_ops,
.modes = BIT(MAX_SERDES_GMSL_PIXEL_MODE),
Expand Down Expand Up @@ -1876,6 +1898,7 @@ static struct i2c_driver max96717_i2c_driver = {
.name = MAX96717_NAME,
.of_match_table = max96717_of_ids,
.acpi_match_table = max96717_acpi_ids,
.pm = pm_sleep_ptr(&max96717_pm_ops),
},
.probe = max96717_probe,
.remove = max96717_remove,
Expand Down
23 changes: 23 additions & 0 deletions drivers/media/i2c/maxim-serdes/max96724.c
Original file line number Diff line number Diff line change
Expand Up @@ -1169,6 +1169,28 @@ static void max96724_remove(struct i2c_client *client)
gpiod_set_value_cansleep(priv->gpiod_enable, 0);
}

static int max96724_suspend(struct device *dev)
{
struct max96724_priv *priv = dev_get_drvdata(dev);

return max_des_suspend(&priv->des);
}

static int max96724_resume(struct device *dev)
{
struct max96724_priv *priv = dev_get_drvdata(dev);
int ret;

ret = max96724_reset(priv);
if (ret)
return ret;

return max_des_resume(&priv->des);
}

static DEFINE_SIMPLE_DEV_PM_OPS(max96724_pm_ops,
max96724_suspend, max96724_resume);

static const struct acpi_device_id max96724_acpi_ids[] = {
{ "INTC1139", (kernel_ulong_t) &max96724_info },
{}
Expand All @@ -1189,6 +1211,7 @@ static struct i2c_driver max96724_i2c_driver = {
.name = "max96724",
.of_match_table = max96724_of_table,
.acpi_match_table = max96724_acpi_ids,
.pm = pm_sleep_ptr(&max96724_pm_ops),
},
.probe = max96724_probe,
.remove = max96724_remove,
Expand Down
Loading