/*
 * Copyright 2020 Google LLC
 *
 * 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.
 */

// SMBus access routines using the kernel /dev interface.

#ifndef THIRD_PARTY_ECCLESIA_LIB_IO_SMBUS_KERNEL_DEV_H_
#define THIRD_PARTY_ECCLESIA_LIB_IO_SMBUS_KERNEL_DEV_H_

#include <cstddef>
#include <cstdint>
#include <string>

#include "absl/status/status.h"
#include "absl/types/span.h"
#include "io/ioctl.h"
#include "io/smbus/smbus.h"

namespace ecclesia {

// SMBus access interface using the kernel /dev/i2c-* files.
class KernelSmbusAccess : public SmbusAccessInterface {
 public:
  KernelSmbusAccess(std::string dev_dir, IoctlInterface *ioctl_intf);

  KernelSmbusAccess(const KernelSmbusAccess &) = delete;
  KernelSmbusAccess &operator=(const KernelSmbusAccess &) = delete;

  absl::Status ProbeDevice(const SmbusLocation &loc) const override;
  absl::Status WriteQuick(const SmbusLocation &loc,
                          uint8_t data) const override;
  absl::Status SendByte(const SmbusLocation &loc, uint8_t data) const override;
  absl::Status ReceiveByte(const SmbusLocation &loc,
                           uint8_t *data) const override;

  absl::Status Write8(const SmbusLocation &loc, int command,
                      uint8_t data) const override;
  absl::Status Read8(const SmbusLocation &loc, int command,
                     uint8_t *data) const override;
  absl::Status Write16(const SmbusLocation &loc, int command,
                       uint16_t data) const override;
  absl::Status Read16(const SmbusLocation &loc, int command,
                      uint16_t *data) const override;

  absl::Status WriteBlockI2C(
      const SmbusLocation &loc, int command,
      absl::Span<const unsigned char> data) const override;
  absl::Status ReadBlockI2C(const SmbusLocation &loc, int command,
                            absl::Span<unsigned char> data,
                            size_t *len) const override;
  bool SupportBlockRead(const SmbusLocation &loc) const override;

 private:
  int OpenI2CSlaveFile(const SmbusLocation &loc) const;
  int OpenI2CMasterFile(const SmbusBus &bus) const;
  int CheckFunctionality(int fd, uint64_t flags) const;

  std::string dev_dir_;
  IoctlInterface *ioctl_;
};

}  // namespace ecclesia

#endif  // THIRD_PARTY_ECCLESIA_LIB_IO_SMBUS_KERNEL_DEV_H_
