#!/usr/bin/env python2

# Copyright 2017 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Autosuspend udev rule generator

This script is executed at build time to generate udev rules. The
resulting rules file is installed on the device, the script itself
is not.
"""

from __future__ import print_function

# List of USB devices (vendorid:productid) for which it is safe to enable
# autosuspend.
USB_IDS = []

# Host Controllers and internal hubs
USB_IDS += [
  # Linux Host Controller (UHCI) (most older x86 boards)
  "1d6b:0001",
  # Linux Host Controller (EHCI) (all boards)
  "1d6b:0002",
  # Linux Host Controller (XHCI) (most newer boards)
  "1d6b:0003",
  # SMSC (Internal HSIC Hub) (most Exynos boards)
  "0424:3503",
  # Intel (Rate Matching Hub) (all x86 boards)
  "05e3:0610",
  # Intel (Internal Hub?) (peppy, falco)
  "8087:0024",
  # Genesys Logic (Internal Hub) (rambi)
  "8087:8000",
]

# Webcams
USB_IDS += [
  # Chicony (zgb)
  "04f2:b1d8",
  # Chicony (mario)
  "04f2:b262",
  # Chicony (stout)
  "04f2:b2fe",
  # Chicony (butterfly)
  "04f2:b35f",
  # Chicony (rambi)
  "04f2:b443",
  # Chicony (glados)
  "04f2:b552",
  # LiteOn (spring)
  "058f:b001",
  # Foxlink? (butterfly)
  "05c8:0351",
  # Foxlink? (butterfly)
  "05c8:0355",
  # Cheng Uei? (falco)
  "05c8:036e",
  # SuYin (parrot)
  "064e:d251",
  # Realtek (falco)
  "0bda:571c",
  # IMC Networks (squawks)
  "13d3:5657",
  # Sunplus (parrot)
  "1bcf:2c17",
  # (C-13HDO10B39N) (alex)
  "2232:1013",
  # (C-10HDP11538N) (lumpy)
  "2232:1017",
  # (Namuga) (link)
  "2232:1033",
  # (C-03FFM12339N) (daisy)
  "2232:1037",
  # (C-10HDO13531N) (peach)
  "2232:1056",
  # (NCM-G102) (samus)
  "2232:6001",
  # Acer (stout)
  "5986:0299",
]

# Bluetooth Host Controller
USB_IDS += [
  # Hon-hai (parrot)
  "0489:e04e",
  # Hon-hai (peppy)
  "0489:e056",
  # Hon-hai (Kahlee)
  "0489:e09f",
  # QCA6174A (delan)
  "0489:e0a2",
  # LiteOn (parrot)
  "04ca:3006",
  # LiteOn (aleena)
  "04ca:3016",
  # LiteOn (scarlet)
  "04ca:301a",
  # Atheros (stumpy, stout)
  "0cf3:3004",
  # Atheros (AR3011) (mario, alex, zgb)
  "0cf3:3005",
  # Atheros (stumyp)
  "0cf3:3007",
  # Atheros (butterfly)
  "0cf3:311e",
  # Atheros (scarlet)
  "0cf3:e300",
  # Marvell (rambi)
  "1286:2046",
  # Marvell (gru)
  "1286:204e",
  # Intel (rambi, samus)
  "8087:07dc",
  # Intel (strago, glados)
  "8087:0a2a",
  # Intel (octopus)
  "8087:0aaa",
]

# WWAN (3G/LTE)
USB_IDS += [
  # Samsung (Y3300) (alex, lumpy)
  "04e8:6872",
  # Samsung (Y3400) (alex, lumpy)
  "04e8:6906",
  # Qualcomm (Gobi 2000) (zgb)
  "05c6:9214",
  # Qualcomm (Gobi 2000) (zgb)
  "05c6:9215",
  # Qualcomm (Gobi 2000) (alex)
  "05c6:9244",
  # Qualcomm (Gobi 2000) (alex)
  "05c6:9245",
  # GCT (WiMax) (daisy)
  "1076:7e0*",
  # GCT (WiMax) (daisy)
  "1076:7f0*",
  # Sierra (Gobi 3000 MC8355) (stout)
  "1199:9012",
  # Sierra (Gobi 3000 MC8355) (stout)
  "1199:9013",
  # Huawei (ME936) (kip, nyan_blaze)
  "12d1:15bb",
  # Novatel (Gobi 3000) (link)
  "1410:9010",
  # Novatel (Gobi 2000) (mario)
  "1410:a010",
  # Novatel (Gobi 2000) (mario)
  "1410:a014",
  # Novatel (Gobi 3000) (alex, lumpy)
  "1410:a020",
  # Novatel (Gobi 3000 E396) (alex, lumpy, daisy)
  "1410:a021",
  # Novatel (Gobi 3000 E396U) (daisy)
  "1410:a023",
  # Altair (LTE) (spring)
  "216f:0047",
  # Fibocom (L850-GL)
  "2cb7:0007",
]

# Mass Storage
USB_IDS += [
  # Genesys (SD card reader) (lumpy, link, peppy)
  "05e3:0727",
  # Realtek (SD card reader) (mario, alex)
  "0bda:0138",
  # Realtek (SD card reader) (falco)
  "0bda:0177",
]

# Security Key
USB_IDS += [
  # Yubico.com
  "1050:0211",
  # Yubico.com (HID firmware)
  "1050:0200",
  # Google Cr50 (HID)
  "18d1:5014",
  # Google Titan key
  "18d1:5026",
]

# USB Audio devices
USB_IDS += [
  # Google USB-C to 3.5mm Digital Headphone Jack Adapter "Mir"
  "18d1:5025",
  # Google USB-C to 3.5mm Digital Headphone Jack Adapter "Mir" (HID only)
  "18d1:5029",
  # Google USB-C to 3.5mm Digital Headphone Jack Adapter 2018 "Condor"
  "18d1:5034",
  # Google Pixel USB-C Earbuds "Blackbird"
  "18d1:5033",
  # Libratone Q Adapt In-Ear USB-C Earphones, Made for Google
  "03eb:2433",
  # Moshi USB-C to 3.5 mm Adapter/Charger, Made for Google
  "282b:48f0",
  # Moshi USB-C to 3.5 mm Adapter/Charger, Made for Google (HID only)
  "282b:0026",
  # AiAiAi TMA-2 C60 Cable, Made for Google
  "0572:1a08",
  # Apple USB-C to 3.5mm Headphone Jack Adapter
  "05ac:110a",
]

# List of PCI devices (vendorid:deviceid) for which it is safe to enable
# autosuspend.
PCI_IDS = []

# Intel
PCI_IDS += [
  # Host bridge
  "8086:590c",
  # i915
  "8086:591e",
  # proc_thermal
  "8086:1903",
  # xhci_hcd
  "8086:9d2f",
  # intel_pmc_core
  "8086:9d21",
  # i801_smbus
  "8086:9d23",
  # iwlwifi
  "8086:095a",
  # GMM
  "8086:1911",
  # Thermal
  "8086:9d31",
  # MME
  "8086:9d3a",
  # CrOS EC
  "8086:9d4b",
  # PCH SPI
  "8086:9d24",
]

# Samsung
PCI_IDS += [
  # NVMe KUS030205M-B001
  "144d:a806",
]

################################################################################

UDEV_RULE = """\
ACTION!="add", GOTO="autosuspend_end"
SUBSYSTEM!="i2c|pci|usb", GOTO="autosuspend_end"

SUBSYSTEM=="i2c", GOTO="autosuspend_i2c"
SUBSYSTEM=="pci", GOTO="autosuspend_pci"
SUBSYSTEM=="usb", GOTO="autosuspend_usb"

# I2C rules
LABEL="autosuspend_i2c"
ATTR{name}=="cyapa", ATTR{power/control}="on", GOTO="autosuspend_end"
GOTO="autosuspend_end"

# PCI rules
LABEL="autosuspend_pci"
%(pci_rules)s\
GOTO="autosuspend_end"

# USB rules
LABEL="autosuspend_usb"
%(usb_rules)s\
GOTO="autosuspend_end"

# Enable autosuspend
LABEL="autosuspend_enable"
TEST=="power/control", ATTR{power/control}="auto", GOTO="autosuspend_end"

LABEL="autosuspend_end"
"""


def main():
  pci_rules = ''
  for dev_ids in PCI_IDS:
    vendor, device = dev_ids.split(":")
    pci_rules += ('ATTR{vendor}=="0x%s", ATTR{device}=="0x%s", '
                  'GOTO="autosuspend_enable"\n' % (vendor, device))

  usb_rules = ''
  for dev_ids in USB_IDS:
    vid, pid = dev_ids.split(':')
    usb_rules += ('ATTR{idVendor}=="%s", ATTR{idProduct}=="%s", '
                  'GOTO="autosuspend_enable"\n' % (vid, pid))

  print(UDEV_RULE % {'pci_rules': pci_rules, 'usb_rules': usb_rules})

if __name__ == '__main__':
  main()
