#!/usr/bin/env python2
# -*- coding: utf-8 -*-

# 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',
    # Microchip (Composite HID + CDC) (kefka)
    '04d8:0b28',
]

# 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',
    # Realtek (blooglet)
    '0bda:b00c',
    # 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',
    # Intel (hatch)
    '8087:0026',
    # Intel (atlas)
    '8087:0025',
]

# WWAN (LTE)
USB_IDS += [
    # Huawei (ME936) (kip)
    '12d1:15bb',
    # Fibocom (L850-GL) (coral, nautilus, sarien)
    '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) (helios)
    '0bda:0136',
    # Realtek (SD card reader) (falco)
    '0bda:0177',
]

# Security Key
USB_IDS += [
    # Yubico.com
    '1050:0211',
    # Yubico.com (HID firmware)
    '1050:0200',
    # 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',
    # SPT PCH xHCI controller
    '8086:9d2f',
    # CNP PCH xHCI controller
    '8086:9ded',
    # 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',
    # SATA
    '8086:02d3',
    # RAM memory
    '8086:02ef',
    # ISA bridge
    '8086:0284',
    # Communication controller
    '8086:02e0',
    # Network controller
    '8086:02f0',
    # Serial bus controller
    '8086:02a4',
    # USB controller
    '8086:02ed',
    # Graphics
    '8086:9b41',
    # DSP
    '8086:02f9',
    # Host bridge
    '8086:9b61',
    # Host bridge
    '8086:9b71',
    # PCI Bridge
    '8086:02b0',
    # i915 (atlas)
    '8086:591c',
    # iwlwifi (atlas)
    '8086:2526',
    # i915 (kefka)
    '8086:22b1',
    # proc_thermal (kefka)
    '8086:22dc',
    # xchi_hdc (kefka)
    '8086:22b5',
    # snd_hda (kefka)
    '8086:2284',
    # pcieport (kefka)
    '8086:22c8',
    '8086:22cc',
    # lpc_ich (kefka)
    '8086:229c',
    # iosf_mbi_pci (kefka)
    '8086:2280',
]

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

# Lite-on
PCI_IDS += [
    # 3C07110288
    '14a4:9100',
]

# Seagate
PCI_IDS += [
    # ZP256CM30011
    '7089:5012',
]

# Kingston
PCI_IDS += [
    # RBUSNS8154P3128GJ3
    '2646:5008',
]

# Do not edit below this line. #################################################

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