Enrico Granata has uploaded this change for review. ( https://review.coreboot.org/27172
Change subject: google/poppy: Add SX9310 support ......................................................................
google/poppy: Add SX9310 support
Prepare a driver for the Semtech SX9310, with the purpose of allowing the device's calibration to be stored in firmware, and then passed on to the kernel via ACPI.
Use this new driver in the devicetree for Nocturne.
Change-Id: I7358ee34df873098a86d692cc8a909b0ec5023a8 Signed-off-by: Enrico Granata egranata@chromium.org --- A src/drivers/i2c/sx9310/Kconfig A src/drivers/i2c/sx9310/Makefile.inc A src/drivers/i2c/sx9310/chip.h A src/drivers/i2c/sx9310/registers.h A src/drivers/i2c/sx9310/sx9310.c M src/mainboard/google/poppy/Kconfig M src/mainboard/google/poppy/variants/nocturne/devicetree.cb 7 files changed, 262 insertions(+), 2 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/72/27172/1
diff --git a/src/drivers/i2c/sx9310/Kconfig b/src/drivers/i2c/sx9310/Kconfig new file mode 100644 index 0000000..887cbcf --- /dev/null +++ b/src/drivers/i2c/sx9310/Kconfig @@ -0,0 +1,6 @@ +config DRIVERS_I2C_SX9310 + bool + default n + help + Board has a Semtech SX9310 proximity sensor + diff --git a/src/drivers/i2c/sx9310/Makefile.inc b/src/drivers/i2c/sx9310/Makefile.inc new file mode 100644 index 0000000..0516df9 --- /dev/null +++ b/src/drivers/i2c/sx9310/Makefile.inc @@ -0,0 +1 @@ +ramstage-$(CONFIG_DRIVERS_I2C_SX9310) += sx9310.c diff --git a/src/drivers/i2c/sx9310/chip.h b/src/drivers/i2c/sx9310/chip.h new file mode 100644 index 0000000..e7b2d8f --- /dev/null +++ b/src/drivers/i2c/sx9310/chip.h @@ -0,0 +1,36 @@ +/* + * This file is part of the coreboot project. + * + * Copyright 2018 Google Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef __DRIVERS_I2C_SX9310_CHIP_H__ +#define __DRIVERS_I2C_SX9310_CHIP_H__ + +#include <drivers/i2c/generic/chip.h> + +#define I2C_SX9310_ACPI_ID "SX9310" +#define I2C_SX9310_ACPI_NAME "Semtech SX9310" + +#define REGISTER(NAME) uint8_t NAME + +struct drivers_i2c_sx9310_config { + const char *desc; /* Device Description */ + unsigned int uid; /* ACPI _UID */ + enum i2c_speed speed; /* Bus speed in Hz, default is I2C_SPEED_FAST */ + struct acpi_irq irq; /* Interrupt */ +#include "registers.h" +}; + +#undef REGISTER + +#endif /* __DRIVERS_I2C_SX9310_CHIP_H__ */ diff --git a/src/drivers/i2c/sx9310/registers.h b/src/drivers/i2c/sx9310/registers.h new file mode 100644 index 0000000..459d1ea --- /dev/null +++ b/src/drivers/i2c/sx9310/registers.h @@ -0,0 +1,42 @@ +/* + * This file is part of the coreboot project. + * + * Copyright 2018 Google Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef REGISTER +#error "define REGISTER(TYPE, NAME) before including this file" +#endif + +REGISTER(reg_prox_ctrl0); +REGISTER(reg_prox_ctrl1); +REGISTER(reg_prox_ctrl2); +REGISTER(reg_prox_ctrl3); +REGISTER(reg_prox_ctrl4); +REGISTER(reg_prox_ctrl5); +REGISTER(reg_prox_ctrl6); +REGISTER(reg_prox_ctrl7); +REGISTER(reg_prox_ctrl8); +REGISTER(reg_prox_ctrl9); +REGISTER(reg_prox_ctrl10); +REGISTER(reg_prox_ctrl11); +REGISTER(reg_prox_ctrl12); +REGISTER(reg_prox_ctrl13); +REGISTER(reg_prox_ctrl14); +REGISTER(reg_prox_ctrl15); +REGISTER(reg_prox_ctrl16); +REGISTER(reg_prox_ctrl17); +REGISTER(reg_prox_ctrl18); +REGISTER(reg_prox_ctrl19); +REGISTER(reg_sar_ctrl0); +REGISTER(reg_sar_ctrl1); +REGISTER(reg_sar_ctrl2); diff --git a/src/drivers/i2c/sx9310/sx9310.c b/src/drivers/i2c/sx9310/sx9310.c new file mode 100644 index 0000000..200834f --- /dev/null +++ b/src/drivers/i2c/sx9310/sx9310.c @@ -0,0 +1,112 @@ +/* + * This file is part of the coreboot project. + * + * Copyright 2016 Google Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <arch/acpi_device.h> +#include <arch/acpigen.h> +#include <console/console.h> +#include <device/i2c_simple.h> +#include <device/device.h> +#include <device/path.h> +#include <gpio.h> +#include <stdint.h> +#include <string.h> +#include "chip.h" + +#if IS_ENABLED(CONFIG_HAVE_ACPI_TABLES) + +#define REGISTER(NAME) acpi_dp_add_integer(dsd, \ + I2C_SX9310_ACPI_ID "," #NAME, \ + config->NAME) + +static void i2c_sx9310_fill_ssdt(struct device *dev) +{ + struct drivers_i2c_sx9310_config *config = dev->chip_info; + const char *scope = acpi_device_scope(dev); + struct acpi_i2c i2c = { + .address = dev->path.i2c.device, + .mode_10bit = dev->path.i2c.mode_10bit, + .speed = config->speed ? : I2C_SPEED_FAST, + .resource = scope, + }; + struct acpi_dp *dsd = NULL; + + if (!dev->enabled || !scope || !config) + return; + + /* Device */ + acpigen_write_scope(scope); + acpigen_write_device(acpi_device_name(dev)); + acpigen_write_name_string("_HID", I2C_SX9310_ACPI_ID); + acpigen_write_name_integer("_UID", config->uid); + acpigen_write_name_string("_DDN", config->desc); + acpigen_write_STA(ACPI_STATUS_DEVICE_ALL_ON); + + /* Resources */ + acpigen_write_name("_CRS"); + acpigen_write_resourcetemplate_header(); + acpi_device_write_i2c(&i2c); + acpi_device_write_interrupt(&config->irq); + acpigen_write_resourcetemplate_footer(); + + /* DSD */ + dsd = acpi_dp_new_table("_DSD"); +#include "registers.h" + acpi_dp_write(dsd); + + acpigen_pop_len(); /* Device */ + acpigen_pop_len(); /* Scope */ +} + +#undef REGISTER + +static const char *i2c_sx9310_acpi_name(const struct device *dev) +{ + static char name[12] = {0}; + + snprintf(name, sizeof(name), "%sD%03.3X", + I2C_SX9310_ACPI_ID, dev->path.i2c.device); + return name; +} +#endif + +static struct device_operations i2c_sx9310_ops = { + .read_resources = DEVICE_NOOP, + .set_resources = DEVICE_NOOP, + .enable_resources = DEVICE_NOOP, +#if IS_ENABLED(CONFIG_HAVE_ACPI_TABLES) + .acpi_name = &i2c_sx9310_acpi_name, + .acpi_fill_ssdt_generator = &i2c_sx9310_fill_ssdt, +#endif +}; + +static void i2c_sx9310_enable(struct device *dev) +{ + struct drivers_i2c_sx9310_config *config = dev->chip_info; + + if (!config) { + dev->enabled = 0; + return; + } + + dev->ops = &i2c_sx9310_ops; + + if (config->desc) + dev->name = config->desc; +} + +struct chip_operations drivers_i2c_sx9310_ops = { + CHIP_NAME(I2C_SX9310_ACPI_NAME) + .enable_dev = &i2c_sx9310_enable +}; diff --git a/src/mainboard/google/poppy/Kconfig b/src/mainboard/google/poppy/Kconfig index 2d9c187..c9a1812 100644 --- a/src/mainboard/google/poppy/Kconfig +++ b/src/mainboard/google/poppy/Kconfig @@ -172,6 +172,7 @@ config VARIANT_SPECIFIC_OPTIONS_NOCTURNE def_bool n select CHROMEOS_WIFI_SAR if CHROMEOS + select DRIVERS_I2C_SX9310 if CHROMEOS_WIFI_SAR select DRIVERS_I2C_MAX98373 select DRIVERS_I2C_DA7219 select DRIVERS_SPI_ACPI diff --git a/src/mainboard/google/poppy/variants/nocturne/devicetree.cb b/src/mainboard/google/poppy/variants/nocturne/devicetree.cb index f746c08..25fe4a7 100644 --- a/src/mainboard/google/poppy/variants/nocturne/devicetree.cb +++ b/src/mainboard/google/poppy/variants/nocturne/devicetree.cb @@ -298,7 +298,38 @@ device i2c 0a on end end end # I2C #0 - Touchscreen - device pci 15.1 on end # I2C #1 - Trackpad + device pci 15.1 on + chip drivers/i2c/sx9310 + register "desc" = ""Left SAR Proximity Sensor"" + register "irq" = "ACPI_IRQ_LEVEL_LOW(GPP_D9_IRQ)" + register "speed" = "I2C_SPEED_FAST_PLUS" + register "uid" = "1" + register "reg_prox_ctrl0" = "0x1A" + register "reg_prox_ctrl1" = "0x00" + register "reg_prox_ctrl2" = "0x84" + register "reg_prox_ctrl3" = "0x0E" + register "reg_prox_ctrl4" = "0x07" + register "reg_prox_ctrl5" = "0xC6" + register "reg_prox_ctrl6" = "0x20" + register "reg_prox_ctrl7" = "0x0D" + register "reg_prox_ctrl8" = "0x8D" + register "reg_prox_ctrl9" = "0x43" + register "reg_prox_ctrl10" = "0x11" + register "reg_prox_ctrl11" = "0x00" + register "reg_prox_ctrl12" = "0x00" + register "reg_prox_ctrl13" = "0x00" + register "reg_prox_ctrl14" = "0x00" + register "reg_prox_ctrl15" = "0x00" + register "reg_prox_ctrl16" = "0x00" + register "reg_prox_ctrl17" = "0x00" + register "reg_prox_ctrl18" = "0x00" + register "reg_prox_ctrl19" = "0x00" + register "reg_sar_ctrl0" = "0x50" + register "reg_sar_ctrl1" = "0x8A" + register "reg_sar_ctrl2" = "0x3C" + device i2c 28 on end + end + end # I2C #1 device pci 15.2 off end # I2C #2 device pci 15.3 on end # I2C #3 - Camera device pci 16.0 on end # Management Engine Interface 1 @@ -308,7 +339,38 @@ device pci 16.4 off end # Management Engine Interface 3 device pci 17.0 off end # SATA device pci 19.0 on end # UART #2 - device pci 19.1 on end # I2C #5 + device pci 19.1 on + chip drivers/i2c/sx9310 + register "desc" = ""Left SAR Proximity Sensor"" + register "irq" = "ACPI_IRQ_LEVEL_LOW(GPP_D10_IRQ)" + register "speed" = "I2C_SPEED_FAST_PLUS" + register "uid" = "1" + register "reg_prox_ctrl0" = "0x1A" + register "reg_prox_ctrl1" = "0x00" + register "reg_prox_ctrl2" = "0x84" + register "reg_prox_ctrl3" = "0x0E" + register "reg_prox_ctrl4" = "0x07" + register "reg_prox_ctrl5" = "0xC6" + register "reg_prox_ctrl6" = "0x20" + register "reg_prox_ctrl7" = "0x0D" + register "reg_prox_ctrl8" = "0x8D" + register "reg_prox_ctrl9" = "0x43" + register "reg_prox_ctrl10" = "0x11" + register "reg_prox_ctrl11" = "0x00" + register "reg_prox_ctrl12" = "0x00" + register "reg_prox_ctrl13" = "0x00" + register "reg_prox_ctrl14" = "0x00" + register "reg_prox_ctrl15" = "0x00" + register "reg_prox_ctrl16" = "0x00" + register "reg_prox_ctrl17" = "0x00" + register "reg_prox_ctrl18" = "0x00" + register "reg_prox_ctrl19" = "0x00" + register "reg_sar_ctrl0" = "0x50" + register "reg_sar_ctrl1" = "0x8A" + register "reg_sar_ctrl2" = "0x3C" + device i2c 28 on end + end + end # I2C #5 device pci 19.2 on chip drivers/i2c/max98373 register "vmon_slot_no" = "4"