/**************************************************************************** * drivers/net/ksz9477_i2c.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. The * ASF licenses this file to you 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. * ****************************************************************************/ /**************************************************************************** * Included Files ****************************************************************************/ #include #include #include #include #include "ksz9477_reg.h" /**************************************************************************** * Private Data ****************************************************************************/ static struct i2c_master_s *g_ksz9477_i2c_bus; /**************************************************************************** * Private Functions ****************************************************************************/ static void setup_i2c_transfer(struct i2c_msg_s *msg, uint8_t *data, size_t len, bool read) { msg[0].frequency = KSZ9477_I2C_SPEED; msg[0].addr = KSZ9477_I2C_ADDRESS; msg[0].flags = read ? I2C_M_READ : 0; msg[0].buffer = data; msg[0].length = len; } /**************************************************************************** * Public Functions ****************************************************************************/ int ksz9477_read(struct ksz9477_transfer_s *read_msg) { struct i2c_msg_s msg[2]; /* Set up to write the address */ setup_i2c_transfer(&msg[0], (uint8_t *)&read_msg->reg, sizeof(read_msg->reg), false); /* Followed by the read data */ setup_i2c_transfer(&msg[1], (uint8_t *)&read_msg->data, read_msg->len - sizeof(read_msg->reg), true); return I2C_TRANSFER(g_ksz9477_i2c_bus, msg, 2); } int ksz9477_write(struct ksz9477_transfer_s *write_msg) { struct i2c_msg_s msg; /* Set up to write the address and data */ setup_i2c_transfer(&msg, (uint8_t *)&write_msg->reg, write_msg->len, false); return I2C_TRANSFER(g_ksz9477_i2c_bus, &msg, 1); } /**************************************************************************** * Name: ksz9477_i2c_init * * Description: * Stores the configured i2c_master and calls the main init function * * Input Parameters: * i2c_bus: The i2c master used as a control interface * master_port: The switch port connected to the host MAC * Returned Value: * OK or negative error number * ****************************************************************************/ int ksz9477_i2c_init(struct i2c_master_s *i2c_bus, ksz9477_port_t master_port) { if (!i2c_bus) { return -EINVAL; } g_ksz9477_i2c_bus = i2c_bus; /* Call the main init function */ return ksz9477_init(master_port); }