Files
system76-coreboot/src/drivers/i2c/max98373/max98373.c
Martin Roth cddd6008f9 AUTHORS: Move src/drivers/[a*-i*] copyrights into AUTHORS file
As discussed on the mailing list and voted upon, the coreboot project
is going to move the majority of copyrights out of the headers and into
an AUTHORS file.  This will happen a bit at a time, as we'll be unifying
license headers at the same time.

Updated Authors file is in a separate commit.

Signed-off-by: Martin Roth <martin@coreboot.org>
Change-Id: I1acea8c975d14904b7e486dc57a1a67480a6ee6e
Reviewed-on: https://review.coreboot.org/c/coreboot/+/36178
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-by: Patrick Georgi <pgeorgi@google.com>
2019-10-22 12:55:10 +00:00

110 lines
3.0 KiB
C

/*
* This file is part of the coreboot project.
*
* 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.h>
#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 <stdint.h>
#include "chip.h"
#define MAX98373_ACPI_NAME "MAXI"
#define MAX98373_ACPI_HID "MX98373"
static void max98373_fill_ssdt(struct device *dev)
{
struct drivers_i2c_max98373_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->bus_speed ? : I2C_SPEED_FAST,
.resource = scope,
};
struct acpi_dp *dp;
if (!dev->enabled || !scope) {
printk(BIOS_ERR, "%s: dev not enabled", __func__);
return;
}
/* Device */
acpigen_write_scope(scope);
acpigen_write_device(acpi_device_name(dev));
acpigen_write_name_string("_HID", MAX98373_ACPI_HID);
acpigen_write_name_integer("_UID", config->uid);
if (config->desc)
acpigen_write_name_string("_DDN", config->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();
/* Device Properties */
dp = acpi_dp_new_table("_DSD");
if (config->interleave_mode)
acpi_dp_add_integer(dp, "maxim,interleave_mode",
config->interleave_mode);
acpi_dp_add_integer(dp, "maxim,vmon-slot-no", config->vmon_slot_no);
acpi_dp_add_integer(dp, "maxim,imon-slot-no", config->imon_slot_no);
acpi_dp_write(dp);
acpigen_pop_len(); /* Device */
acpigen_pop_len(); /* Scope */
printk(BIOS_INFO, "%s: %s address 0%xh\n", acpi_device_path(dev),
dev->chip_ops->name, dev->path.i2c.device);
}
static const char *max98373_acpi_name(const struct device *dev)
{
struct drivers_i2c_max98373_config *config = dev->chip_info;
if (config->name)
return config->name;
return MAX98373_ACPI_NAME;
}
static struct device_operations max98373_ops = {
.read_resources = DEVICE_NOOP,
.set_resources = DEVICE_NOOP,
.enable_resources = DEVICE_NOOP,
.acpi_name = max98373_acpi_name,
.acpi_fill_ssdt_generator = max98373_fill_ssdt,
};
static void max98373_enable(struct device *dev)
{
struct drivers_i2c_max98373_config *config = dev->chip_info;
dev->ops = &max98373_ops;
if (config && config->desc) {
dev->name = config->desc;
}
}
struct chip_operations drivers_i2c_max98373_ops = {
CHIP_NAME("Maxim MAX98373 Codec")
.enable_dev = max98373_enable
};