| /* SPDX-License-Identifier: GPL-2.0-only */ |
| |
| #include <console/console.h> |
| #include <device/smbus.h> |
| #include <device/pci.h> |
| #include "chip.h" |
| #include "tas5825m.h" |
| |
| int tas5825m_write_at(struct device *dev, uint8_t addr, uint8_t value) |
| { |
| return smbus_write_byte(dev, addr, value); |
| } |
| |
| //TODO: use I2C block write for better performance |
| int tas5825m_write_block_at(struct device *dev, uint8_t addr, |
| const uint8_t *values, uint8_t length) |
| { |
| int res = 0; |
| for (uint8_t i = 0; i < length; i++) { |
| res = smbus_write_byte(dev, addr + i, values[i]); |
| if (res < 0) |
| return res; |
| } |
| return (int)length; |
| } |
| |
| int tas5825m_set_page(struct device *dev, uint8_t page) |
| { |
| return tas5825m_write_at(dev, 0x00, page); |
| } |
| |
| int tas5825m_set_book(struct device *dev, uint8_t book) |
| { |
| int res = tas5825m_set_page(dev, 0x00); |
| if (res < 0) |
| return res; |
| return tas5825m_write_at(dev, 0x7F, book); |
| } |
| |
| __weak int tas5825m_setup(struct device *dev, int id) |
| { |
| printk(BIOS_ERR, "tas5825m: setup not implemented\n"); |
| return -1; |
| } |
| |
| static void tas5825m_init(struct device *dev) |
| { |
| if (dev->enabled && dev->path.type == DEVICE_PATH_I2C && |
| ops_smbus_bus(get_pbus_smbus(dev))) { |
| printk(BIOS_DEBUG, "tas5825m at %s\n", dev_path(dev)); |
| |
| struct drivers_i2c_tas5825m_config *config = dev->chip_info; |
| if (config) { |
| printk(BIOS_DEBUG, "tas5825m id %d\n", config->id); |
| int res = tas5825m_setup(dev, config->id); |
| if (res) |
| printk(BIOS_ERR, "tas5825m init failed: %d\n", res); |
| else |
| printk(BIOS_DEBUG, "tas5825m init successful\n"); |
| } else { |
| printk(BIOS_ERR, "tas5825m: failed to find config\n"); |
| } |
| } |
| } |
| |
| static struct device_operations tas5825m_operations = { |
| .read_resources = noop_read_resources, |
| .set_resources = noop_set_resources, |
| .init = tas5825m_init, |
| }; |
| |
| static void tas5825m_enable_dev(struct device *dev) |
| { |
| dev->ops = &tas5825m_operations; |
| } |
| |
| struct chip_operations drivers_i2c_tas5825m_ops = { |
| .name = "TI TAS5825M Amplifier", |
| .enable_dev = tas5825m_enable_dev, |
| }; |