[coreboot-gerrit] Change in coreboot[master]: google/poppy: Add SX9310 support

Enrico Granata (Code Review) gerrit at coreboot.org
Wed Jun 20 20:47:56 CEST 2018


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 at 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"

-- 
To view, visit https://review.coreboot.org/27172
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I7358ee34df873098a86d692cc8a909b0ec5023a8
Gerrit-Change-Number: 27172
Gerrit-PatchSet: 1
Gerrit-Owner: Enrico Granata <egranata at chromium.org>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.coreboot.org/pipermail/coreboot-gerrit/attachments/20180620/4e920e24/attachment-0001.html>


More information about the coreboot-gerrit mailing list