diff --git a/.github/workflows/quality.yml b/.github/workflows/reusable-quality.yml
similarity index 92%
rename from .github/workflows/quality.yml
rename to .github/workflows/reusable-quality.yml
index 847bfd7cc..dd9f3590c 100644
--- a/.github/workflows/quality.yml
+++ b/.github/workflows/reusable-quality.yml
@@ -4,12 +4,7 @@
 name: "Quality"
 
 on:
-  push:
-    branches:
-      - master
-      - nedbat/*
-  pull_request:
-  workflow_dispatch:
+  workflow_call:
 
 defaults:
   run:
@@ -21,10 +16,6 @@ env:
 permissions:
   contents: read
 
-concurrency:
-  group: "${{ github.workflow }}-${{ github.ref }}"
-  cancel-in-progress: true
-
 jobs:
   lint:
     name: "Pylint etc"
diff --git a/.github/workflows/testsuite.yml b/.github/workflows/testsuite.yml
index 8f878e662..141486915 100644
--- a/.github/workflows/testsuite.yml
+++ b/.github/workflows/testsuite.yml
@@ -28,6 +28,12 @@ concurrency:
   cancel-in-progress: true
 
 jobs:
+  linters:
+    name: Quality
+    # Don't run linters if the branch name includes "-notests"
+    if: "!contains(github.ref, '-notests')"
+    uses: ./.github/workflows/reusable-quality.yml
+
   tests:
     name: "${{ matrix.python-version }} on ${{ matrix.os }}"
     runs-on: "${{ matrix.os }}-latest"
@@ -94,6 +100,7 @@ jobs:
     # The tests didn't run if the branch name includes "-notests"
     if: "!contains(github.ref, '-notests')"
     needs:
+      - linters
       - tests
     runs-on: ubuntu-latest
     steps: