mirror of
https://github.com/corundum/corundum.git
synced 2025-01-30 08:32:52 +08:00
Pull I2C driver code into separate module
This commit is contained in:
parent
3e0c23f24f
commit
59606f2cbf
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
# object files to build
|
# object files to build
|
||||||
obj-m += mqnic.o
|
obj-m += mqnic.o
|
||||||
mqnic-objs += mqnic_main.o mqnic_dev.o mqnic_netdev.o mqnic_ethtool.o mqnic_ptp.o mqnic_tx.o mqnic_rx.o mqnic_cq.o mqnic_eq.o
|
mqnic-objs += mqnic_main.o mqnic_dev.o mqnic_netdev.o mqnic_ethtool.o mqnic_i2c.o mqnic_ptp.o mqnic_tx.o mqnic_rx.o mqnic_cq.o mqnic_eq.o
|
||||||
|
|
||||||
all:
|
all:
|
||||||
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
|
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
|
||||||
|
@ -263,6 +263,10 @@ void mqnic_register_phc(struct mqnic_dev *mdev);
|
|||||||
void mqnic_unregister_phc(struct mqnic_dev *mdev);
|
void mqnic_unregister_phc(struct mqnic_dev *mdev);
|
||||||
ktime_t mqnic_read_cpl_ts(struct mqnic_dev *mdev, struct mqnic_ring *ring, const struct mqnic_cpl *cpl);
|
ktime_t mqnic_read_cpl_ts(struct mqnic_dev *mdev, struct mqnic_ring *ring, const struct mqnic_cpl *cpl);
|
||||||
|
|
||||||
|
// mqnic_i2c.c
|
||||||
|
int mqnic_init_i2c(struct mqnic_dev *mqnic);
|
||||||
|
void mqnic_remove_i2c(struct mqnic_dev *mqnic);
|
||||||
|
|
||||||
// mqnic_eq.c
|
// mqnic_eq.c
|
||||||
int mqnic_create_eq_ring(struct mqnic_priv *priv, struct mqnic_eq_ring **ring_ptr, int size, int stride, int index, u8 __iomem *hw_addr);
|
int mqnic_create_eq_ring(struct mqnic_priv *priv, struct mqnic_eq_ring **ring_ptr, int size, int stride, int index, u8 __iomem *hw_addr);
|
||||||
void mqnic_destroy_eq_ring(struct mqnic_priv *priv, struct mqnic_eq_ring **ring_ptr);
|
void mqnic_destroy_eq_ring(struct mqnic_priv *priv, struct mqnic_eq_ring **ring_ptr);
|
||||||
|
151
modules/mqnic/mqnic_i2c.c
Normal file
151
modules/mqnic/mqnic_i2c.c
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
Copyright 2019, The Regents of the University of California.
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE REGENTS OF THE UNIVERSITY OF CALIFORNIA ''AS
|
||||||
|
IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF CALIFORNIA OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||||
|
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||||
|
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||||
|
OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
The views and conclusions contained in the software and documentation are those
|
||||||
|
of the authors and should not be interpreted as representing official policies,
|
||||||
|
either expressed or implied, of The Regents of the University of California.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mqnic.h"
|
||||||
|
|
||||||
|
void mqnic_i2c_set_scl(void *data, int state)
|
||||||
|
{
|
||||||
|
struct mqnic_i2c_priv *priv = data;
|
||||||
|
|
||||||
|
if (state)
|
||||||
|
{
|
||||||
|
iowrite32(ioread32(priv->scl_out_reg) | priv->scl_out_mask, priv->scl_out_reg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
iowrite32(ioread32(priv->scl_out_reg) & ~priv->scl_out_mask, priv->scl_out_reg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void mqnic_i2c_set_sda(void *data, int state)
|
||||||
|
{
|
||||||
|
struct mqnic_i2c_priv *priv = data;
|
||||||
|
|
||||||
|
if (state)
|
||||||
|
{
|
||||||
|
iowrite32(ioread32(priv->sda_out_reg) | priv->sda_out_mask, priv->sda_out_reg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
iowrite32(ioread32(priv->sda_out_reg) & ~priv->sda_out_mask, priv->sda_out_reg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int mqnic_i2c_get_scl(void *data)
|
||||||
|
{
|
||||||
|
struct mqnic_i2c_priv *priv = data;
|
||||||
|
|
||||||
|
return !!(ioread32(priv->scl_in_reg) & priv->scl_in_mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
int mqnic_i2c_get_sda(void *data)
|
||||||
|
{
|
||||||
|
struct mqnic_i2c_priv *priv = data;
|
||||||
|
|
||||||
|
return !!(ioread32(priv->sda_in_reg) & priv->sda_in_mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct i2c_algo_bit_data mqnic_i2c_algo = {
|
||||||
|
.setsda = mqnic_i2c_set_sda,
|
||||||
|
.setscl = mqnic_i2c_set_scl,
|
||||||
|
.getsda = mqnic_i2c_get_sda,
|
||||||
|
.getscl = mqnic_i2c_get_scl,
|
||||||
|
.udelay = 5,
|
||||||
|
.timeout = 20
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct i2c_board_info mqnic_eeprom_info = {
|
||||||
|
I2C_BOARD_INFO("24c02", 0x50),
|
||||||
|
};
|
||||||
|
|
||||||
|
int mqnic_init_i2c(struct mqnic_dev *mqnic)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
// interface i2c interfaces
|
||||||
|
// TODO
|
||||||
|
|
||||||
|
// eeprom i2c interface
|
||||||
|
switch (mqnic->board_id) {
|
||||||
|
case MQNIC_BOARD_ID_EXANIC_X10:
|
||||||
|
case MQNIC_BOARD_ID_ADM_PCIE_9V3:
|
||||||
|
mqnic->eeprom_i2c_adap.owner = THIS_MODULE;
|
||||||
|
mqnic->eeprom_i2c_priv.mqnic = mqnic;
|
||||||
|
mqnic->eeprom_i2c_priv.scl_in_reg = mqnic->hw_addr+MQNIC_REG_GPIO_IN;
|
||||||
|
mqnic->eeprom_i2c_priv.scl_out_reg = mqnic->hw_addr+MQNIC_REG_GPIO_OUT;
|
||||||
|
mqnic->eeprom_i2c_priv.sda_in_reg = mqnic->hw_addr+MQNIC_REG_GPIO_IN;
|
||||||
|
mqnic->eeprom_i2c_priv.sda_out_reg = mqnic->hw_addr+MQNIC_REG_GPIO_OUT;
|
||||||
|
mqnic->eeprom_i2c_priv.scl_in_mask = 1 << 24;
|
||||||
|
mqnic->eeprom_i2c_priv.scl_out_mask = 1 << 24;
|
||||||
|
mqnic->eeprom_i2c_priv.sda_in_mask = 1 << 25;
|
||||||
|
mqnic->eeprom_i2c_priv.sda_out_mask = 1 << 25;
|
||||||
|
mqnic->eeprom_i2c_algo = mqnic_i2c_algo;
|
||||||
|
mqnic->eeprom_i2c_algo.data = &mqnic->eeprom_i2c_priv;
|
||||||
|
mqnic->eeprom_i2c_adap.algo_data = &mqnic->eeprom_i2c_algo;
|
||||||
|
mqnic->eeprom_i2c_adap.dev.parent = &mqnic->pdev->dev;
|
||||||
|
iowrite32(ioread32(mqnic->hw_addr+MQNIC_REG_GPIO_OUT) & ~(1 << 26), mqnic->hw_addr+MQNIC_REG_GPIO_OUT); // WP disable
|
||||||
|
strlcpy(mqnic->eeprom_i2c_adap.name, "mqnic EEPROM", sizeof(mqnic->eeprom_i2c_adap.name));
|
||||||
|
ret = i2c_bit_add_bus(&mqnic->eeprom_i2c_adap);
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
mqnic->eeprom_i2c_client = i2c_new_device(&mqnic->eeprom_i2c_adap, &mqnic_eeprom_info);
|
||||||
|
if (mqnic->eeprom_i2c_client == NULL)
|
||||||
|
{
|
||||||
|
ret = -ENODEV;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mqnic_remove_i2c(struct mqnic_dev *mqnic)
|
||||||
|
{
|
||||||
|
// eeprom i2c interface
|
||||||
|
if (mqnic->eeprom_i2c_client)
|
||||||
|
{
|
||||||
|
i2c_unregister_device(mqnic->eeprom_i2c_client);
|
||||||
|
mqnic->eeprom_i2c_client = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mqnic->eeprom_i2c_adap.owner)
|
||||||
|
{
|
||||||
|
i2c_del_adapter(&mqnic->eeprom_i2c_adap);
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&mqnic->eeprom_i2c_adap, 0, sizeof(mqnic->eeprom_i2c_adap));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -50,118 +50,6 @@ static const struct pci_device_id pci_ids[] = {
|
|||||||
|
|
||||||
MODULE_DEVICE_TABLE(pci, pci_ids);
|
MODULE_DEVICE_TABLE(pci, pci_ids);
|
||||||
|
|
||||||
void mqnic_i2c_set_scl(void *data, int state)
|
|
||||||
{
|
|
||||||
struct mqnic_i2c_priv *priv = data;
|
|
||||||
|
|
||||||
if (state)
|
|
||||||
{
|
|
||||||
iowrite32(ioread32(priv->scl_out_reg) | priv->scl_out_mask, priv->scl_out_reg);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
iowrite32(ioread32(priv->scl_out_reg) & ~priv->scl_out_mask, priv->scl_out_reg);
|
|
||||||
}
|
|
||||||
ioread32(priv->scl_out_reg);
|
|
||||||
}
|
|
||||||
|
|
||||||
void mqnic_i2c_set_sda(void *data, int state)
|
|
||||||
{
|
|
||||||
struct mqnic_i2c_priv *priv = data;
|
|
||||||
|
|
||||||
if (state)
|
|
||||||
{
|
|
||||||
iowrite32(ioread32(priv->sda_out_reg) | priv->sda_out_mask, priv->sda_out_reg);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
iowrite32(ioread32(priv->sda_out_reg) & ~priv->sda_out_mask, priv->sda_out_reg);
|
|
||||||
}
|
|
||||||
ioread32(priv->sda_out_reg);
|
|
||||||
}
|
|
||||||
|
|
||||||
int mqnic_i2c_get_scl(void *data)
|
|
||||||
{
|
|
||||||
struct mqnic_i2c_priv *priv = data;
|
|
||||||
|
|
||||||
return !!(ioread32(priv->scl_in_reg) & priv->scl_in_mask);
|
|
||||||
}
|
|
||||||
|
|
||||||
int mqnic_i2c_get_sda(void *data)
|
|
||||||
{
|
|
||||||
struct mqnic_i2c_priv *priv = data;
|
|
||||||
|
|
||||||
return !!(ioread32(priv->sda_in_reg) & priv->sda_in_mask);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct i2c_algo_bit_data mqnic_i2c_algo = {
|
|
||||||
.setsda = mqnic_i2c_set_sda,
|
|
||||||
.setscl = mqnic_i2c_set_scl,
|
|
||||||
.getsda = mqnic_i2c_get_sda,
|
|
||||||
.getscl = mqnic_i2c_get_scl,
|
|
||||||
.udelay = 5,
|
|
||||||
.timeout = 20
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct i2c_board_info mqnic_eeprom_info = {
|
|
||||||
I2C_BOARD_INFO("24c02", 0x50),
|
|
||||||
};
|
|
||||||
|
|
||||||
static int mqnic_init_i2c(struct mqnic_dev *mqnic)
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
// interface i2c interfaces
|
|
||||||
// TODO
|
|
||||||
|
|
||||||
// eeprom i2c interface
|
|
||||||
mqnic->eeprom_i2c_adap.owner = THIS_MODULE;
|
|
||||||
mqnic->eeprom_i2c_priv.mqnic = mqnic;
|
|
||||||
mqnic->eeprom_i2c_priv.scl_in_reg = mqnic->hw_addr+MQNIC_REG_GPIO_IN;
|
|
||||||
mqnic->eeprom_i2c_priv.scl_out_reg = mqnic->hw_addr+MQNIC_REG_GPIO_OUT;
|
|
||||||
mqnic->eeprom_i2c_priv.sda_in_reg = mqnic->hw_addr+MQNIC_REG_GPIO_IN;
|
|
||||||
mqnic->eeprom_i2c_priv.sda_out_reg = mqnic->hw_addr+MQNIC_REG_GPIO_OUT;
|
|
||||||
mqnic->eeprom_i2c_priv.scl_in_mask = 1 << 24;
|
|
||||||
mqnic->eeprom_i2c_priv.scl_out_mask = 1 << 24;
|
|
||||||
mqnic->eeprom_i2c_priv.sda_in_mask = 1 << 25;
|
|
||||||
mqnic->eeprom_i2c_priv.sda_out_mask = 1 << 25;
|
|
||||||
mqnic->eeprom_i2c_algo = mqnic_i2c_algo;
|
|
||||||
mqnic->eeprom_i2c_algo.data = &mqnic->eeprom_i2c_priv;
|
|
||||||
mqnic->eeprom_i2c_adap.algo_data = &mqnic->eeprom_i2c_algo;
|
|
||||||
mqnic->eeprom_i2c_adap.dev.parent = &mqnic->pdev->dev;
|
|
||||||
iowrite32(ioread32(mqnic->hw_addr+MQNIC_REG_GPIO_OUT) & ~(1 << 26), mqnic->hw_addr+MQNIC_REG_GPIO_OUT); // WP disable
|
|
||||||
strlcpy(mqnic->eeprom_i2c_adap.name, "mqnic EEPROM", sizeof(mqnic->eeprom_i2c_adap.name));
|
|
||||||
ret = i2c_bit_add_bus(&mqnic->eeprom_i2c_adap);
|
|
||||||
if (ret)
|
|
||||||
{
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
mqnic->eeprom_i2c_client = i2c_new_device(&mqnic->eeprom_i2c_adap, &mqnic_eeprom_info);
|
|
||||||
if (mqnic->eeprom_i2c_client == NULL)
|
|
||||||
{
|
|
||||||
ret = -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mqnic_remove_i2c(struct mqnic_dev *mqnic)
|
|
||||||
{
|
|
||||||
// eeprom i2c interface
|
|
||||||
if (mqnic->eeprom_i2c_client)
|
|
||||||
{
|
|
||||||
i2c_unregister_device(mqnic->eeprom_i2c_client);
|
|
||||||
mqnic->eeprom_i2c_client = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mqnic->eeprom_i2c_adap.owner)
|
|
||||||
{
|
|
||||||
i2c_del_adapter(&mqnic->eeprom_i2c_adap);
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&mqnic->eeprom_i2c_adap, 0, sizeof(mqnic->eeprom_i2c_adap));
|
|
||||||
}
|
|
||||||
|
|
||||||
static LIST_HEAD(mqnic_devices);
|
static LIST_HEAD(mqnic_devices);
|
||||||
static DEFINE_SPINLOCK(mqnic_devices_lock);
|
static DEFINE_SPINLOCK(mqnic_devices_lock);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user