#!/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",
  # 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",
  # LiteOn (parrot)
  "04ca:3006",
  # 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",
]

# 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",
  # 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",
]

# 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()
