/** * Copyright © 2024 IBM Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include "pmbus_driver_device.hpp" #include "rail.hpp" #include "services.hpp" #include #include #include #include #include #include namespace phosphor::power::sequencer { /** * @class UCD90xDevice * * PMBusDriverDevice sub-class for the UCD90X family of power sequencer devices. * * These devices share a common device driver. */ class UCD90xDevice : public PMBusDriverDevice { public: // Specify which compiler-generated methods we want UCD90xDevice() = delete; UCD90xDevice(const UCD90xDevice&) = delete; UCD90xDevice(UCD90xDevice&&) = delete; UCD90xDevice& operator=(const UCD90xDevice&) = delete; UCD90xDevice& operator=(UCD90xDevice&&) = delete; virtual ~UCD90xDevice() = default; /** * Constructor. * * @param name Device name * @param rails Voltage rails that are enabled and monitored by this device * @param services System services like hardware presence and the journal * @param bus I2C bus for the device * @param address I2C address for the device */ explicit UCD90xDevice(const std::string& name, std::vector> rails, Services& services, uint8_t bus, uint16_t address) : PMBusDriverDevice(name, std::move(rails), services, bus, address, driverName) {} /** * Returns the value of the PMBus MFR_STATUS command. * * This is a manufacturer-specific command that replaces the standard * STATUS_MFR_SPECIFIC command on UCD90x devices. * * The returned value is in host-endian order. * * Note that the UCD90x documentation states that this is a paged command. * This means that the PMBus PAGE should be set, and some of the bits in the * command value are page-specific. However, the current device driver only * provides a single file in sysfs, and the driver always sets the PAGE to * 0. Thus, the bits that are page-specific in the returned value are * always for PAGE 0. * * Throws an exception if the value could not be obtained. * * @return MFR_STATUS value */ virtual uint64_t getMfrStatus(); constexpr static std::string driverName{"ucd9000"}; protected: /** @copydoc PMBusDriverDevice::storePgoodFaultDebugData() */ virtual void storePgoodFaultDebugData( Services& services, const std::vector& gpioValues, std::map& additionalData) override; }; } // namespace phosphor::power::sequencer