<p>Enrico Granata has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/27173">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">drivers/i2c: Add a driver for Semtech SX9310<br><br>This adds a new driver for the SX9310 proximity detector device.<br>The purpose of this is to enable the device's calibration information<br>to be stored in firmware, and then transferred over to the kernel<br>via ACPI.<br><br>This device has more than 10 individual configuration parameters,<br>so they would not fit in the generic driver's properties table.<br><br>Change-Id: Id8c434eec9fe2da731e142442503a12e88db2236<br>Signed-off-by: Enrico Granata <egranata@chromium.org><br>---<br>A src/drivers/i2c/sx9310/Kconfig<br>A src/drivers/i2c/sx9310/Makefile.inc<br>A src/drivers/i2c/sx9310/chip.h<br>A src/drivers/i2c/sx9310/registers.h<br>A src/drivers/i2c/sx9310/sx9310.c<br>5 files changed, 189 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/73/27173/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/drivers/i2c/sx9310/Kconfig b/src/drivers/i2c/sx9310/Kconfig</span><br><span>new file mode 100644</span><br><span>index 0000000..b0d9ca3</span><br><span>--- /dev/null</span><br><span>+++ b/src/drivers/i2c/sx9310/Kconfig</span><br><span>@@ -0,0 +1,6 @@</span><br><span style="color: hsl(120, 100%, 40%);">+config DRIVERS_I2C_SX9310</span><br><span style="color: hsl(120, 100%, 40%);">+        bool</span><br><span style="color: hsl(120, 100%, 40%);">+  default n</span><br><span style="color: hsl(120, 100%, 40%);">+     depends on HAVE_ACPI_TABLES</span><br><span style="color: hsl(120, 100%, 40%);">+   help</span><br><span style="color: hsl(120, 100%, 40%);">+    Board has a Semtech SX9310 proximity sensor</span><br><span>diff --git a/src/drivers/i2c/sx9310/Makefile.inc b/src/drivers/i2c/sx9310/Makefile.inc</span><br><span>new file mode 100644</span><br><span>index 0000000..0516df9</span><br><span>--- /dev/null</span><br><span>+++ b/src/drivers/i2c/sx9310/Makefile.inc</span><br><span>@@ -0,0 +1 @@</span><br><span style="color: hsl(120, 100%, 40%);">+ramstage-$(CONFIG_DRIVERS_I2C_SX9310) += sx9310.c</span><br><span>diff --git a/src/drivers/i2c/sx9310/chip.h b/src/drivers/i2c/sx9310/chip.h</span><br><span>new file mode 100644</span><br><span>index 0000000..1b930e3</span><br><span>--- /dev/null</span><br><span>+++ b/src/drivers/i2c/sx9310/chip.h</span><br><span>@@ -0,0 +1,36 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * This file is part of the coreboot project.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright 2018 Google LLC</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; version 2 of the License.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef __DRIVERS_I2C_SX9310_CHIP_H__</span><br><span style="color: hsl(120, 100%, 40%);">+#define __DRIVERS_I2C_SX9310_CHIP_H__</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <drivers/i2c/generic/chip.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define I2C_SX9310_ACPI_ID      "SX9310"</span><br><span style="color: hsl(120, 100%, 40%);">+#define I2C_SX9310_ACPI_NAME        "Semtech SX9310"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define REGISTER(NAME) uint8_t NAME</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct drivers_i2c_sx9310_config {</span><br><span style="color: hsl(120, 100%, 40%);">+       const char *desc;       /* Device Description */</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned int uid;       /* ACPI _UID */</span><br><span style="color: hsl(120, 100%, 40%);">+       enum i2c_speed speed;   /* Bus speed in Hz, default is I2C_SPEED_FAST */</span><br><span style="color: hsl(120, 100%, 40%);">+      struct acpi_irq irq;    /* Interrupt */</span><br><span style="color: hsl(120, 100%, 40%);">+#include "registers.h"</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#undef REGISTER</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#endif /* __DRIVERS_I2C_SX9310_CHIP_H__ */</span><br><span>diff --git a/src/drivers/i2c/sx9310/registers.h b/src/drivers/i2c/sx9310/registers.h</span><br><span>new file mode 100644</span><br><span>index 0000000..f90fc5a</span><br><span>--- /dev/null</span><br><span>+++ b/src/drivers/i2c/sx9310/registers.h</span><br><span>@@ -0,0 +1,42 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * This file is part of the coreboot project.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright 2018 Google LLC</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; version 2 of the License.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef REGISTER</span><br><span style="color: hsl(120, 100%, 40%);">+#error "define REGISTER(TYPE, NAME) before including this file"</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_prox_ctrl0);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_prox_ctrl1);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_prox_ctrl2);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_prox_ctrl3);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_prox_ctrl4);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_prox_ctrl5);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_prox_ctrl6);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_prox_ctrl7);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_prox_ctrl8);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_prox_ctrl9);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_prox_ctrl10);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_prox_ctrl11);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_prox_ctrl12);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_prox_ctrl13);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_prox_ctrl14);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_prox_ctrl15);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_prox_ctrl16);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_prox_ctrl17);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_prox_ctrl18);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_prox_ctrl19);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_sar_ctrl0);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_sar_ctrl1);</span><br><span style="color: hsl(120, 100%, 40%);">+REGISTER(reg_sar_ctrl2);</span><br><span>diff --git a/src/drivers/i2c/sx9310/sx9310.c b/src/drivers/i2c/sx9310/sx9310.c</span><br><span>new file mode 100644</span><br><span>index 0000000..f2ee332</span><br><span>--- /dev/null</span><br><span>+++ b/src/drivers/i2c/sx9310/sx9310.c</span><br><span>@@ -0,0 +1,104 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * This file is part of the coreboot project.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright 2018 Google LLC</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; version 2 of the License.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <arch/acpi_device.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <arch/acpigen.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <device/i2c_simple.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <device/device.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <device/path.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include "chip.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define REGISTER(NAME) acpi_dp_add_integer(dsd, \</span><br><span style="color: hsl(120, 100%, 40%);">+                                     I2C_SX9310_ACPI_ID "," #NAME, \</span><br><span style="color: hsl(120, 100%, 40%);">+                                     config->NAME)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void i2c_sx9310_fill_ssdt(struct device *dev)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct drivers_i2c_sx9310_config *config = dev->chip_info;</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *scope = acpi_device_scope(dev);</span><br><span style="color: hsl(120, 100%, 40%);">+   struct acpi_i2c i2c = {</span><br><span style="color: hsl(120, 100%, 40%);">+               .address = dev->path.i2c.device,</span><br><span style="color: hsl(120, 100%, 40%);">+           .mode_10bit = dev->path.i2c.mode_10bit,</span><br><span style="color: hsl(120, 100%, 40%);">+            .speed = config->speed ? : I2C_SPEED_FAST,</span><br><span style="color: hsl(120, 100%, 40%);">+         .resource = scope,</span><br><span style="color: hsl(120, 100%, 40%);">+    };</span><br><span style="color: hsl(120, 100%, 40%);">+    struct acpi_dp *dsd;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!dev->enabled || !scope || !config)</span><br><span style="color: hsl(120, 100%, 40%);">+            return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Device */</span><br><span style="color: hsl(120, 100%, 40%);">+  acpigen_write_scope(scope);</span><br><span style="color: hsl(120, 100%, 40%);">+   acpigen_write_device(acpi_device_name(dev));</span><br><span style="color: hsl(120, 100%, 40%);">+  acpigen_write_name_string("_HID", I2C_SX9310_ACPI_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      acpigen_write_name_integer("_UID", config->uid);</span><br><span style="color: hsl(120, 100%, 40%);">+ acpigen_write_name_string("_DDN", config->desc);</span><br><span style="color: hsl(120, 100%, 40%);">+ acpigen_write_STA(ACPI_STATUS_DEVICE_ALL_ON);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Resources */</span><br><span style="color: hsl(120, 100%, 40%);">+       acpigen_write_name("_CRS");</span><br><span style="color: hsl(120, 100%, 40%);">+ acpigen_write_resourcetemplate_header();</span><br><span style="color: hsl(120, 100%, 40%);">+      acpi_device_write_i2c(&i2c);</span><br><span style="color: hsl(120, 100%, 40%);">+      acpi_device_write_interrupt(&config->irq);</span><br><span style="color: hsl(120, 100%, 40%);">+     acpigen_write_resourcetemplate_footer();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* DSD */</span><br><span style="color: hsl(120, 100%, 40%);">+     dsd = acpi_dp_new_table("_DSD");</span><br><span style="color: hsl(120, 100%, 40%);">+#include "registers.h"</span><br><span style="color: hsl(120, 100%, 40%);">+  acpi_dp_write(dsd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ acpigen_pop_len(); /* Device */</span><br><span style="color: hsl(120, 100%, 40%);">+       acpigen_pop_len(); /* Scope */</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#undef REGISTER</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const char *i2c_sx9310_acpi_name(const struct device *dev)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  static char name[5] = {0};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  snprintf(name, sizeof(name), "D%03.3X", dev->path.i2c.device);</span><br><span style="color: hsl(120, 100%, 40%);">+   return name;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct device_operations i2c_sx9310_ops = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .read_resources           = DEVICE_NOOP,</span><br><span style="color: hsl(120, 100%, 40%);">+      .set_resources            = DEVICE_NOOP,</span><br><span style="color: hsl(120, 100%, 40%);">+      .enable_resources         = DEVICE_NOOP,</span><br><span style="color: hsl(120, 100%, 40%);">+      .acpi_name                = &i2c_sx9310_acpi_name,</span><br><span style="color: hsl(120, 100%, 40%);">+        .acpi_fill_ssdt_generator = &i2c_sx9310_fill_ssdt,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void i2c_sx9310_enable(struct device *dev)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct drivers_i2c_sx9310_config *config = dev->chip_info;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!config) {</span><br><span style="color: hsl(120, 100%, 40%);">+                dev->enabled = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+          return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   dev->ops = &i2c_sx9310_ops;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (config->desc)</span><br><span style="color: hsl(120, 100%, 40%);">+          dev->name = config->desc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct chip_operations drivers_i2c_sx9310_ops = {</span><br><span style="color: hsl(120, 100%, 40%);">+       CHIP_NAME(I2C_SX9310_ACPI_NAME)</span><br><span style="color: hsl(120, 100%, 40%);">+       .enable_dev = &i2c_sx9310_enable</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/27173">change 27173</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/27173"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Id8c434eec9fe2da731e142442503a12e88db2236 </div>
<div style="display:none"> Gerrit-Change-Number: 27173 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Enrico Granata <egranata@chromium.org> </div>