summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/drivers/i2c/rx6110sa/chip.h1
-rw-r--r--src/drivers/i2c/rx6110sa/rx6110sa.c67
-rw-r--r--src/drivers/i2c/rx6110sa/rx6110sa.h4
3 files changed, 70 insertions, 2 deletions
diff --git a/src/drivers/i2c/rx6110sa/chip.h b/src/drivers/i2c/rx6110sa/chip.h
index 46ef7f1e3a..4df95806ac 100644
--- a/src/drivers/i2c/rx6110sa/chip.h
+++ b/src/drivers/i2c/rx6110sa/chip.h
@@ -3,6 +3,7 @@
#include "rx6110sa.h"
struct drivers_i2c_rx6110sa_config {
+ unsigned int bus_speed; /* Bus clock in Hz (default 400 kHz)*/
/* The day (of the week) is indicated by 7 bits, bit 0 to bit 6. */
unsigned char user_weekday; /* User day of the week to set */
unsigned char user_day; /* User day to set */
diff --git a/src/drivers/i2c/rx6110sa/rx6110sa.c b/src/drivers/i2c/rx6110sa/rx6110sa.c
index ca39bdb1bc..2b8b9b28f0 100644
--- a/src/drivers/i2c/rx6110sa/rx6110sa.c
+++ b/src/drivers/i2c/rx6110sa/rx6110sa.c
@@ -1,7 +1,10 @@
/* SPDX-License-Identifier: GPL-2.0-only */
-#include <device/i2c_bus.h>
+#include <acpi/acpi_device.h>
+#include <acpi/acpigen.h>
#include <device/device.h>
+#include <device/i2c.h>
+#include <device/i2c_bus.h>
#include <version.h>
#include <console/console.h>
#include <bcd.h>
@@ -163,11 +166,71 @@ static void rx6110sa_init(struct device *dev)
rx6110sa_write(dev, CTRL_REG, reg);
}
+#if CONFIG(HAVE_ACPI_TABLES)
+static void rx6110sa_fill_ssdt(const struct device *dev)
+{
+ struct drivers_i2c_rx6110sa_config *config = dev->chip_info;
+ const char *scope = acpi_device_scope(dev);
+ enum i2c_speed bus_speed;
+
+ if (!scope)
+ return;
+
+ switch (config->bus_speed) {
+ case I2C_SPEED_STANDARD:
+ case I2C_SPEED_FAST:
+ bus_speed = config->bus_speed;
+ break;
+ default:
+ printk(BIOS_INFO, "%s: Bus speed unsupported, fall back to %d kHz!\n",
+ dev_path(dev), I2C_SPEED_STANDARD / 1000);
+ bus_speed = I2C_SPEED_STANDARD;
+ break;
+ }
+
+ struct acpi_i2c i2c = {
+ .address = dev->path.i2c.device,
+ .mode_10bit = dev->path.i2c.mode_10bit,
+ .speed = bus_speed,
+ .resource = scope,
+ };
+
+ /* Device */
+ acpigen_write_scope(scope);
+ acpigen_write_device(acpi_device_name(dev));
+ acpigen_write_name_string("_HID", RX6110SA_HID_NAME);
+ acpigen_write_name_string("_DDN", RX6110SA_HID_DESC);
+ acpigen_write_STA(acpi_device_status(dev));
+
+ /* Resources */
+ acpigen_write_name("_CRS");
+ acpigen_write_resourcetemplate_header();
+ acpi_device_write_i2c(&i2c);
+
+ acpigen_write_resourcetemplate_footer();
+
+ acpigen_pop_len(); /* Device */
+ acpigen_pop_len(); /* Scope */
+
+ printk(BIOS_INFO, "%s: %s at %s\n", acpi_device_path(dev),
+ dev->chip_ops->name, dev_path(dev));
+}
+
+static const char *rx6110sa_acpi_name(const struct device *dev)
+{
+ return RX6110SA_ACPI_NAME;
+}
+#endif
+
static struct device_operations rx6110sa_ops = {
.read_resources = noop_read_resources,
.set_resources = noop_set_resources,
.init = rx6110sa_init,
- .final = rx6110sa_final
+ .final = rx6110sa_final,
+#if CONFIG(HAVE_ACPI_TABLES)
+ .acpi_name = rx6110sa_acpi_name,
+ .acpi_fill_ssdt = rx6110sa_fill_ssdt,
+#endif
};
static void rx6110sa_enable(struct device *dev)
diff --git a/src/drivers/i2c/rx6110sa/rx6110sa.h b/src/drivers/i2c/rx6110sa/rx6110sa.h
index 187bad424f..73f43b3a5b 100644
--- a/src/drivers/i2c/rx6110sa/rx6110sa.h
+++ b/src/drivers/i2c/rx6110sa/rx6110sa.h
@@ -7,6 +7,10 @@
#define RX6110SA_SLAVE_ADR 0x32
#define RX6110SA_I2C_CONTROLLER 0
+#define RX6110SA_ACPI_NAME "ERX6"
+#define RX6110SA_HID_NAME "RX6110SA"
+#define RX6110SA_HID_DESC "Real Time Clock"
+
/* Register layout */
#define SECOND_REG 0x10
#define MINUTE_REG 0x11