mirror of
https://github.com/Telecominfraproject/OpenNetworkLinux.git
synced 2025-12-27 10:14:47 +00:00
The 3.2 kernel configuration now uses the platform modules as well.
All platforms reverted to 3.2 for initial testing.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64
|
||||
KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64 onl-kernel-3.2-deb7-x86-64-all:amd64
|
||||
KMODULES := $(wildcard *.c)
|
||||
PLATFORM := x86-64-accton-as5712-54x
|
||||
ARCH := x86_64
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-mux.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/version.h>
|
||||
|
||||
static struct dmi_system_id as5712_dmi_table[] = {
|
||||
{
|
||||
@@ -266,7 +267,7 @@ static ssize_t show_cpld_version(struct device *dev, struct device_attribute *at
|
||||
len = sprintf(buf, "%d", i2c_smbus_read_byte_data(client, reg));
|
||||
|
||||
return len;
|
||||
}
|
||||
}
|
||||
|
||||
static struct device_attribute ver = __ATTR(version, 0600, show_cpld_version, NULL);
|
||||
|
||||
@@ -313,9 +314,11 @@ static int accton_i2c_cpld_mux_probe(struct i2c_client *client,
|
||||
int idx;
|
||||
#endif
|
||||
data->virt_adaps[chan] = i2c_add_mux_adapter(adap, &client->dev, client, 0, chan,
|
||||
I2C_CLASS_HWMON | I2C_CLASS_SPD,
|
||||
accton_i2c_cpld_mux_select_chan,
|
||||
accton_i2c_cpld_mux_deselect_mux);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
|
||||
I2C_CLASS_HWMON | I2C_CLASS_SPD,
|
||||
#endif
|
||||
accton_i2c_cpld_mux_select_chan,
|
||||
accton_i2c_cpld_mux_deselect_mux);
|
||||
|
||||
if (data->virt_adaps[chan] == NULL) {
|
||||
ret = -ENODEV;
|
||||
@@ -463,5 +466,3 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
module_init(accton_i2c_cpld_mux_init);
|
||||
module_exit(accton_i2c_cpld_mux_exit);
|
||||
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ x86-64-accton-as5712-54x-r0:
|
||||
--stop=1
|
||||
|
||||
kernel:
|
||||
<<: *kernel-3-16
|
||||
<<: *kernel-3-2
|
||||
|
||||
args: >-
|
||||
nopat
|
||||
|
||||
@@ -9,9 +9,9 @@ class OnlPlatform_x86_64_accton_as5712_54x_r0(OnlPlatformAccton,
|
||||
SYS_OBJECT_ID=".5712.54"
|
||||
|
||||
def baseconfig(self):
|
||||
self.insmod('cpr_4011_4mxx', required=False)
|
||||
self.insmod('cpr_4011_4mxx')
|
||||
for m in [ 'cpld', 'fan', 'psu', 'leds', 'sfp' ]:
|
||||
self.insmod("x86-64-accton-as5712-54x-%s.ko" % m, required=False)
|
||||
self.insmod("x86-64-accton-as5712-54x-%s.ko" % m)
|
||||
|
||||
########### initialize I2C bus 0 ###########
|
||||
# initialize CPLDs
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64
|
||||
KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64 onl-kernel-3.2-deb7-x86-64-all:amd64
|
||||
KMODULES := $(wildcard *.c)
|
||||
PLATFORM := x86-64-accton-as5812-54t
|
||||
ARCH := x86_64
|
||||
|
||||
@@ -18,7 +18,7 @@ x86-64-accton-as5812-54t-r0:
|
||||
--stop=1
|
||||
|
||||
kernel:
|
||||
<<: *kernel-3-16
|
||||
<<: *kernel-3-2
|
||||
|
||||
args: >-
|
||||
nopat
|
||||
|
||||
@@ -10,10 +10,10 @@ class OnlPlatform_x86_64_accton_as5812_54t_r0(OnlPlatformAccton,
|
||||
|
||||
def baseconfig(self):
|
||||
########### initialize I2C bus 0 ###########
|
||||
self.insmod("accton_i2c_cpld", required=False)
|
||||
self.insmod("cpr_4011_4mxx", required=False)
|
||||
self.insmod("accton_i2c_cpld")
|
||||
self.insmod("cpr_4011_4mxx")
|
||||
for m in [ "sfp", "psu", "fan", "leds" ]:
|
||||
self.insmod("x86-64-accton-as5812-54t-%s" % m, required=False)
|
||||
self.insmod("x86-64-accton-as5812-54t-%s" % m)
|
||||
|
||||
# initialize CPLDs
|
||||
self.new_i2c_device('accton_i2c_cpld', 0x60, 0)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64
|
||||
KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64 onl-kernel-3.2-deb7-x86-64-all:amd64
|
||||
KMODULES := $(wildcard *.c)
|
||||
PLATFORM := x86-64-accton-as5812-54x
|
||||
ARCH := x86_64
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-mux.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/version.h>
|
||||
|
||||
static struct dmi_system_id as5812_54x_dmi_table[] = {
|
||||
{
|
||||
@@ -228,7 +229,7 @@ static ssize_t show_cpld_version(struct device *dev, struct device_attribute *at
|
||||
len = sprintf(buf, "%d", i2c_smbus_read_byte_data(client, reg));
|
||||
|
||||
return len;
|
||||
}
|
||||
}
|
||||
|
||||
static struct device_attribute ver = __ATTR(version, 0600, show_cpld_version, NULL);
|
||||
|
||||
@@ -262,9 +263,11 @@ static int accton_i2c_cpld_mux_probe(struct i2c_client *client,
|
||||
/* Now create an adapter for each channel */
|
||||
for (chan = 0; chan < chips[data->type].nchans; chan++) {
|
||||
data->virt_adaps[chan] = i2c_add_mux_adapter(adap, &client->dev, client, 0, chan,
|
||||
I2C_CLASS_HWMON | I2C_CLASS_SPD,
|
||||
accton_i2c_cpld_mux_select_chan,
|
||||
accton_i2c_cpld_mux_deselect_mux);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
|
||||
I2C_CLASS_HWMON | I2C_CLASS_SPD,
|
||||
#endif
|
||||
accton_i2c_cpld_mux_select_chan,
|
||||
accton_i2c_cpld_mux_deselect_mux);
|
||||
|
||||
if (data->virt_adaps[chan] == NULL) {
|
||||
ret = -ENODEV;
|
||||
@@ -391,5 +394,3 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
module_init(accton_i2c_cpld_mux_init);
|
||||
module_exit(accton_i2c_cpld_mux_exit);
|
||||
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ x86-64-accton-as5812-54x-r0:
|
||||
--stop=1
|
||||
|
||||
kernel:
|
||||
<<: *kernel-3-16
|
||||
<<: *kernel-3-2
|
||||
|
||||
args: >-
|
||||
nopat
|
||||
|
||||
@@ -9,9 +9,9 @@ class OnlPlatform_x86_64_accton_as5812_54x_r0(OnlPlatformAccton,
|
||||
SYS_OBJECT_ID=".5812.54.1"
|
||||
|
||||
def baseconfig(self):
|
||||
self.insmod('cpr_4011_4mxx', required=False)
|
||||
self.insmod('cpr_4011_4mxx')
|
||||
for m in [ 'cpld', 'fan', 'psu', 'leds', 'sfp' ]:
|
||||
self.insmod("x86-64-accton-as5812-54x-%s.ko" % m, required=False)
|
||||
self.insmod("x86-64-accton-as5812-54x-%s.ko" % m)
|
||||
|
||||
########### initialize I2C bus 0 ###########
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64
|
||||
KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64 onl-kernel-3.2-deb7-x86-64-all:amd64
|
||||
KMODULES := $(wildcard *.c)
|
||||
PLATFORM := x86-64-accton-as6712-32x
|
||||
ARCH := x86_64
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-mux.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/version.h>
|
||||
|
||||
static struct dmi_system_id as6712_dmi_table[] = {
|
||||
{
|
||||
@@ -132,7 +133,7 @@ static int accton_i2c_cpld_mux_reg_write(struct i2c_adapter *adap,
|
||||
buf[1] = val;
|
||||
msg.buf = buf;
|
||||
ret = adap->algo->master_xfer(adap, &msg, 1);
|
||||
}
|
||||
}
|
||||
else {
|
||||
union i2c_smbus_data data;
|
||||
ret = adap->algo->smbus_xfer(adap, client->addr,
|
||||
@@ -157,7 +158,7 @@ static int accton_i2c_cpld_mux_reg_write(struct i2c_adapter *adap,
|
||||
/* Retry automatically on arbitration loss */
|
||||
orig_jiffies = jiffies;
|
||||
for (res = 0, try = 0; try <= adap->retries; try++) {
|
||||
res = adap->algo->smbus_xfer(adap, client->addr, flags,
|
||||
res = adap->algo->smbus_xfer(adap, client->addr, flags,
|
||||
I2C_SMBUS_WRITE, 0x2,
|
||||
I2C_SMBUS_BYTE_DATA, &data);
|
||||
if (res != -EAGAIN)
|
||||
@@ -196,21 +197,21 @@ static int accton_i2c_cpld_mux_deselect_mux(struct i2c_adapter *adap,
|
||||
|
||||
/* Deselect active channel */
|
||||
data->last_chan = chips[data->type].deselectChan;
|
||||
|
||||
|
||||
return accton_i2c_cpld_mux_reg_write(adap, client, data->last_chan);
|
||||
}
|
||||
|
||||
static void accton_i2c_cpld_add_client(struct i2c_client *client)
|
||||
{
|
||||
struct cpld_client_node *node = kzalloc(sizeof(struct cpld_client_node), GFP_KERNEL);
|
||||
|
||||
|
||||
if (!node) {
|
||||
dev_dbg(&client->dev, "Can't allocate cpld_client_node (0x%x)\n", client->addr);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
node->client = client;
|
||||
|
||||
|
||||
mutex_lock(&list_lock);
|
||||
list_add(&node->list, &cpld_client_list);
|
||||
mutex_unlock(&list_lock);
|
||||
@@ -221,24 +222,24 @@ static void accton_i2c_cpld_remove_client(struct i2c_client *client)
|
||||
struct list_head *list_node = NULL;
|
||||
struct cpld_client_node *cpld_node = NULL;
|
||||
int found = 0;
|
||||
|
||||
|
||||
mutex_lock(&list_lock);
|
||||
|
||||
list_for_each(list_node, &cpld_client_list)
|
||||
{
|
||||
cpld_node = list_entry(list_node, struct cpld_client_node, list);
|
||||
|
||||
|
||||
if (cpld_node->client == client) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (found) {
|
||||
list_del(list_node);
|
||||
kfree(cpld_node);
|
||||
}
|
||||
|
||||
|
||||
mutex_unlock(&list_lock);
|
||||
}
|
||||
|
||||
@@ -252,7 +253,7 @@ static ssize_t show_cpld_version(struct device *dev, struct device_attribute *at
|
||||
len = sprintf(buf, "%d", i2c_smbus_read_byte_data(client, reg));
|
||||
|
||||
return len;
|
||||
}
|
||||
}
|
||||
|
||||
static struct device_attribute ver = __ATTR(version, 0600, show_cpld_version, NULL);
|
||||
|
||||
@@ -294,17 +295,19 @@ static int accton_i2c_cpld_mux_probe(struct i2c_client *client,
|
||||
data->last_chan = chips[data->type].deselectChan; /* force the first selection */
|
||||
|
||||
/* Now create an adapter for each channel */
|
||||
for (chan = 0; chan < chips[data->type].nchans; chan++) {
|
||||
for (chan = 0; chan < chips[data->type].nchans; chan++) {
|
||||
data->virt_adaps[chan] = i2c_add_mux_adapter(adap, &client->dev, client, 0, chan,
|
||||
I2C_CLASS_HWMON | I2C_CLASS_SPD,
|
||||
accton_i2c_cpld_mux_select_chan,
|
||||
accton_i2c_cpld_mux_deselect_mux);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
|
||||
I2C_CLASS_HWMON | I2C_CLASS_SPD,
|
||||
#endif
|
||||
accton_i2c_cpld_mux_select_chan,
|
||||
accton_i2c_cpld_mux_deselect_mux);
|
||||
|
||||
if (data->virt_adaps[chan] == NULL) {
|
||||
ret = -ENODEV;
|
||||
dev_err(&client->dev, "failed to register multiplexed adapter %d\n", chan);
|
||||
goto virt_reg_failed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dev_info(&client->dev, "registered %d multiplexed busses for I2C mux %s\n",
|
||||
@@ -338,14 +341,14 @@ static int accton_i2c_cpld_mux_remove(struct i2c_client *client)
|
||||
|
||||
for (chan = 0; chan < chip->nchans; ++chan) {
|
||||
if (data->virt_adaps[chan]) {
|
||||
i2c_del_mux_adapter(data->virt_adaps[chan]);
|
||||
i2c_del_mux_adapter(data->virt_adaps[chan]);
|
||||
data->virt_adaps[chan] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
kfree(data);
|
||||
accton_i2c_cpld_remove_client(client);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -354,19 +357,19 @@ int as6712_32x_i2c_cpld_read(unsigned short cpld_addr, u8 reg)
|
||||
struct list_head *list_node = NULL;
|
||||
struct cpld_client_node *cpld_node = NULL;
|
||||
int ret = -EPERM;
|
||||
|
||||
|
||||
mutex_lock(&list_lock);
|
||||
|
||||
list_for_each(list_node, &cpld_client_list)
|
||||
{
|
||||
cpld_node = list_entry(list_node, struct cpld_client_node, list);
|
||||
|
||||
|
||||
if (cpld_node->client->addr == cpld_addr) {
|
||||
ret = i2c_smbus_read_byte_data(cpld_node->client, reg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
mutex_unlock(&list_lock);
|
||||
|
||||
return ret;
|
||||
@@ -378,19 +381,19 @@ int as6712_32x_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value)
|
||||
struct list_head *list_node = NULL;
|
||||
struct cpld_client_node *cpld_node = NULL;
|
||||
int ret = -EIO;
|
||||
|
||||
|
||||
mutex_lock(&list_lock);
|
||||
|
||||
list_for_each(list_node, &cpld_client_list)
|
||||
{
|
||||
cpld_node = list_entry(list_node, struct cpld_client_node, list);
|
||||
|
||||
|
||||
if (cpld_node->client->addr == cpld_addr) {
|
||||
ret = i2c_smbus_write_byte_data(cpld_node->client, reg, value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
mutex_unlock(&list_lock);
|
||||
|
||||
return ret;
|
||||
@@ -424,5 +427,3 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
module_init(accton_i2c_cpld_mux_init);
|
||||
module_exit(accton_i2c_cpld_mux_exit);
|
||||
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ x86-64-accton-as6712-32x-r0:
|
||||
--stop=1
|
||||
|
||||
kernel:
|
||||
<<: *kernel-3-16
|
||||
<<: *kernel-3-2
|
||||
|
||||
args: >-
|
||||
nopat
|
||||
|
||||
@@ -8,9 +8,9 @@ class OnlPlatform_x86_64_accton_as6712_32x_r0(OnlPlatformAccton,
|
||||
SYS_OBJECT_ID=".6712.32"
|
||||
|
||||
def baseconfig(self):
|
||||
self.insmod('cpr_4011_4mxx', required=False)
|
||||
self.insmod('cpr_4011_4mxx')
|
||||
for m in [ 'cpld', 'fan', 'psu', 'leds', 'sfp' ]:
|
||||
self.insmod("x86-64-accton-as6712-32x-%s.ko" % m, required=False)
|
||||
self.insmod("x86-64-accton-as6712-32x-%s.ko" % m)
|
||||
|
||||
########### initialize I2C bus 0 ###########
|
||||
# initialize CPLD
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64
|
||||
KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64 onl-kernel-3.2-deb7-x86-64-all:amd64
|
||||
KMODULES := $(wildcard *.c)
|
||||
PLATFORM := x86-64-accton-as6812-32x
|
||||
ARCH := x86_64
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-mux.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/version.h>
|
||||
|
||||
static struct dmi_system_id as6812_dmi_table[] = {
|
||||
{
|
||||
@@ -132,7 +133,7 @@ static int accton_i2c_cpld_mux_reg_write(struct i2c_adapter *adap,
|
||||
/* Retry automatically on arbitration loss */
|
||||
orig_jiffies = jiffies;
|
||||
for (res = 0, try = 0; try <= adap->retries; try++) {
|
||||
res = adap->algo->smbus_xfer(adap, client->addr, flags,
|
||||
res = adap->algo->smbus_xfer(adap, client->addr, flags,
|
||||
I2C_SMBUS_WRITE, 0x2,
|
||||
I2C_SMBUS_BYTE_DATA, &data);
|
||||
if (res != -EAGAIN)
|
||||
@@ -170,21 +171,21 @@ static int accton_i2c_cpld_mux_deselect_mux(struct i2c_adapter *adap,
|
||||
|
||||
/* Deselect active channel */
|
||||
data->last_chan = chips[data->type].deselectChan;
|
||||
|
||||
|
||||
return accton_i2c_cpld_mux_reg_write(adap, client, data->last_chan);
|
||||
}
|
||||
|
||||
static void accton_i2c_cpld_add_client(struct i2c_client *client)
|
||||
{
|
||||
struct cpld_client_node *node = kzalloc(sizeof(struct cpld_client_node), GFP_KERNEL);
|
||||
|
||||
|
||||
if (!node) {
|
||||
dev_dbg(&client->dev, "Can't allocate cpld_client_node (0x%x)\n", client->addr);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
node->client = client;
|
||||
|
||||
|
||||
mutex_lock(&list_lock);
|
||||
list_add(&node->list, &cpld_client_list);
|
||||
mutex_unlock(&list_lock);
|
||||
@@ -195,24 +196,24 @@ static void accton_i2c_cpld_remove_client(struct i2c_client *client)
|
||||
struct list_head *list_node = NULL;
|
||||
struct cpld_client_node *cpld_node = NULL;
|
||||
int found = 0;
|
||||
|
||||
|
||||
mutex_lock(&list_lock);
|
||||
|
||||
list_for_each(list_node, &cpld_client_list)
|
||||
{
|
||||
cpld_node = list_entry(list_node, struct cpld_client_node, list);
|
||||
|
||||
|
||||
if (cpld_node->client == client) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (found) {
|
||||
list_del(list_node);
|
||||
kfree(cpld_node);
|
||||
}
|
||||
|
||||
|
||||
mutex_unlock(&list_lock);
|
||||
}
|
||||
|
||||
@@ -226,7 +227,7 @@ static ssize_t show_cpld_version(struct device *dev, struct device_attribute *at
|
||||
len = sprintf(buf, "%d", i2c_smbus_read_byte_data(client, reg));
|
||||
|
||||
return len;
|
||||
}
|
||||
}
|
||||
|
||||
static struct device_attribute ver = __ATTR(version, 0600, show_cpld_version, NULL);
|
||||
|
||||
@@ -258,17 +259,19 @@ static int accton_i2c_cpld_mux_probe(struct i2c_client *client,
|
||||
data->last_chan = chips[data->type].deselectChan; /* force the first selection */
|
||||
|
||||
/* Now create an adapter for each channel */
|
||||
for (chan = 0; chan < chips[data->type].nchans; chan++) {
|
||||
for (chan = 0; chan < chips[data->type].nchans; chan++) {
|
||||
data->virt_adaps[chan] = i2c_add_mux_adapter(adap, &client->dev, client, 0, chan,
|
||||
I2C_CLASS_HWMON | I2C_CLASS_SPD,
|
||||
accton_i2c_cpld_mux_select_chan,
|
||||
accton_i2c_cpld_mux_deselect_mux);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
|
||||
I2C_CLASS_HWMON | I2C_CLASS_SPD,
|
||||
#endif
|
||||
accton_i2c_cpld_mux_select_chan,
|
||||
accton_i2c_cpld_mux_deselect_mux);
|
||||
|
||||
if (data->virt_adaps[chan] == NULL) {
|
||||
ret = -ENODEV;
|
||||
dev_err(&client->dev, "failed to register multiplexed adapter %d\n", chan);
|
||||
goto virt_reg_failed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dev_info(&client->dev, "registered %d multiplexed busses for I2C mux %s\n",
|
||||
@@ -302,14 +305,14 @@ static int accton_i2c_cpld_mux_remove(struct i2c_client *client)
|
||||
|
||||
for (chan = 0; chan < chip->nchans; ++chan) {
|
||||
if (data->virt_adaps[chan]) {
|
||||
i2c_del_mux_adapter(data->virt_adaps[chan]);
|
||||
i2c_del_mux_adapter(data->virt_adaps[chan]);
|
||||
data->virt_adaps[chan] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
kfree(data);
|
||||
accton_i2c_cpld_remove_client(client);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -318,19 +321,19 @@ int as6812_32x_i2c_cpld_read(unsigned short cpld_addr, u8 reg)
|
||||
struct list_head *list_node = NULL;
|
||||
struct cpld_client_node *cpld_node = NULL;
|
||||
int ret = -EPERM;
|
||||
|
||||
|
||||
mutex_lock(&list_lock);
|
||||
|
||||
list_for_each(list_node, &cpld_client_list)
|
||||
{
|
||||
cpld_node = list_entry(list_node, struct cpld_client_node, list);
|
||||
|
||||
|
||||
if (cpld_node->client->addr == cpld_addr) {
|
||||
ret = i2c_smbus_read_byte_data(cpld_node->client, reg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
mutex_unlock(&list_lock);
|
||||
|
||||
return ret;
|
||||
@@ -342,19 +345,19 @@ int as6812_32x_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value)
|
||||
struct list_head *list_node = NULL;
|
||||
struct cpld_client_node *cpld_node = NULL;
|
||||
int ret = -EIO;
|
||||
|
||||
|
||||
mutex_lock(&list_lock);
|
||||
|
||||
list_for_each(list_node, &cpld_client_list)
|
||||
{
|
||||
cpld_node = list_entry(list_node, struct cpld_client_node, list);
|
||||
|
||||
|
||||
if (cpld_node->client->addr == cpld_addr) {
|
||||
ret = i2c_smbus_write_byte_data(cpld_node->client, reg, value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
mutex_unlock(&list_lock);
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -18,7 +18,7 @@ x86-64-accton-as6812-32x-r0:
|
||||
--stop=1
|
||||
|
||||
kernel:
|
||||
<<: *kernel-3-16
|
||||
<<: *kernel-3-2
|
||||
|
||||
args: >-
|
||||
nopat
|
||||
|
||||
@@ -8,10 +8,9 @@ class OnlPlatform_x86_64_accton_as6812_32x_r0(OnlPlatformAccton,
|
||||
SYS_OBJECT_ID=".6812.32"
|
||||
|
||||
def baseconfig(self):
|
||||
|
||||
self.insmod('cpr_4011_4mxx', required=False)
|
||||
self.insmod('cpr_4011_4mxx')
|
||||
for m in [ 'cpld', 'fan', 'psu', 'leds', 'sfp' ]:
|
||||
self.insmod("x86-64-accton-as6812-32x-%s.ko" % m, required=False)
|
||||
self.insmod("x86-64-accton-as6812-32x-%s.ko" % m)
|
||||
|
||||
########### initialize I2C bus 0 ###########
|
||||
# initialize CPLD
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64
|
||||
KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64 onl-kernel-3.2-deb7-x86-64-all:amd64
|
||||
KMODULES := $(wildcard *.c)
|
||||
PLATFORM := x86-64-accton-as7712-32x
|
||||
ARCH := x86_64
|
||||
|
||||
@@ -43,6 +43,7 @@ extern int accton_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value);
|
||||
*/
|
||||
static const u8 fan_reg[] = {
|
||||
0x0F, /* fan 1-6 present status */
|
||||
0x10, /* fan 1-6 direction(0:B2F 1:F2B) */
|
||||
0x11, /* fan PWM(for all fan) */
|
||||
0x12, /* front fan 1 speed(rpm) */
|
||||
0x13, /* front fan 2 speed(rpm) */
|
||||
@@ -78,6 +79,7 @@ enum fan_id {
|
||||
|
||||
enum sysfs_fan_attributes {
|
||||
FAN_PRESENT_REG,
|
||||
FAN_DIRECTION_REG,
|
||||
FAN_DUTY_CYCLE_PERCENTAGE, /* Only one CPLD register to control duty cycle for all fans */
|
||||
FAN1_FRONT_SPEED_RPM,
|
||||
FAN2_FRONT_SPEED_RPM,
|
||||
@@ -91,6 +93,12 @@ enum sysfs_fan_attributes {
|
||||
FAN4_REAR_SPEED_RPM,
|
||||
FAN5_REAR_SPEED_RPM,
|
||||
FAN6_REAR_SPEED_RPM,
|
||||
FAN1_DIRECTION,
|
||||
FAN2_DIRECTION,
|
||||
FAN3_DIRECTION,
|
||||
FAN4_DIRECTION,
|
||||
FAN5_DIRECTION,
|
||||
FAN6_DIRECTION,
|
||||
FAN1_PRESENT,
|
||||
FAN2_PRESENT,
|
||||
FAN3_PRESENT,
|
||||
@@ -150,6 +158,13 @@ DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(3);
|
||||
DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(4);
|
||||
DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(5);
|
||||
DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(6);
|
||||
/* 6 fan direction attribute in this platform */
|
||||
DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(1);
|
||||
DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(2);
|
||||
DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(3);
|
||||
DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(4);
|
||||
DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(5);
|
||||
DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(6);
|
||||
/* 1 fan duty cycle attribute in this platform */
|
||||
DECLARE_FAN_DUTY_CYCLE_SENSOR_DEV_ATTR();
|
||||
|
||||
@@ -173,6 +188,12 @@ static struct attribute *as7712_32x_fan_attributes[] = {
|
||||
DECLARE_FAN_PRESENT_ATTR(4),
|
||||
DECLARE_FAN_PRESENT_ATTR(5),
|
||||
DECLARE_FAN_PRESENT_ATTR(6),
|
||||
DECLARE_FAN_DIRECTION_ATTR(1),
|
||||
DECLARE_FAN_DIRECTION_ATTR(2),
|
||||
DECLARE_FAN_DIRECTION_ATTR(3),
|
||||
DECLARE_FAN_DIRECTION_ATTR(4),
|
||||
DECLARE_FAN_DIRECTION_ATTR(5),
|
||||
DECLARE_FAN_DIRECTION_ATTR(6),
|
||||
DECLARE_FAN_DUTY_CYCLE_ATTR(),
|
||||
NULL
|
||||
};
|
||||
@@ -209,6 +230,14 @@ static u32 reg_val_to_speed_rpm(u8 reg_val)
|
||||
return (u32)reg_val * FAN_REG_VAL_TO_SPEED_RPM_STEP;
|
||||
}
|
||||
|
||||
static u8 reg_val_to_direction(u8 reg_val, enum fan_id id)
|
||||
{
|
||||
u8 mask = (1 << id);
|
||||
|
||||
reg_val &= mask;
|
||||
|
||||
return reg_val ? 1 : 0;
|
||||
}
|
||||
static u8 reg_val_to_is_present(u8 reg_val, enum fan_id id)
|
||||
{
|
||||
u8 mask = (1 << id);
|
||||
@@ -299,6 +328,16 @@ static ssize_t fan_show_value(struct device *dev, struct device_attribute *da,
|
||||
case FAN6_FAULT:
|
||||
ret = sprintf(buf, "%d\n", is_fan_fault(data, attr->index - FAN1_FAULT));
|
||||
break;
|
||||
case FAN1_DIRECTION:
|
||||
case FAN2_DIRECTION:
|
||||
case FAN3_DIRECTION:
|
||||
case FAN4_DIRECTION:
|
||||
case FAN5_DIRECTION:
|
||||
case FAN6_DIRECTION:
|
||||
ret = sprintf(buf, "%d\n",
|
||||
reg_val_to_direction(data->reg_val[FAN_DIRECTION_REG],
|
||||
attr->index - FAN1_DIRECTION));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -430,10 +469,10 @@ static struct i2c_driver as7712_32x_fan_driver = {
|
||||
|
||||
static int __init as7712_32x_fan_init(void)
|
||||
{
|
||||
extern int platform_accton_as7712_32x(void);
|
||||
if (!platform_accton_as7712_32x()) {
|
||||
return -ENODEV;
|
||||
}
|
||||
extern int platform_accton_as7712_32x(void);
|
||||
if (!platform_accton_as7712_32x()) {
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return i2c_add_driver(&as7712_32x_fan_driver);
|
||||
}
|
||||
|
||||
@@ -34,14 +34,18 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/dmi.h>
|
||||
|
||||
#define MAX_MODEL_NAME 16
|
||||
|
||||
#define DC12V_FAN_DIR_OFFSET 0x34
|
||||
#define DC12V_FAN_DIR_LEN 3
|
||||
|
||||
static ssize_t show_status(struct device *dev, struct device_attribute *da, char *buf);
|
||||
static ssize_t show_model_name(struct device *dev, struct device_attribute *da, char *buf);
|
||||
static int as7712_32x_psu_read_block(struct i2c_client *client, u8 command, u8 *data,int data_len);
|
||||
extern int accton_i2c_cpld_read(unsigned short cpld_addr, u8 reg);
|
||||
|
||||
/* Addresses scanned
|
||||
*/
|
||||
static const unsigned short normal_i2c[] = { 0x50, 0x53, I2C_CLIENT_END };
|
||||
static const unsigned short normal_i2c[] = { I2C_CLIENT_END };
|
||||
|
||||
/* Each client has this additional data
|
||||
*/
|
||||
@@ -52,27 +56,32 @@ struct as7712_32x_psu_data {
|
||||
unsigned long last_updated; /* In jiffies */
|
||||
u8 index; /* PSU index */
|
||||
u8 status; /* Status(present/power_good) register read from CPLD */
|
||||
char model_name[9]; /* Model name, read from eeprom */
|
||||
char model_name[MAX_MODEL_NAME]; /* Model name, read from eeprom */
|
||||
char fan_dir[DC12V_FAN_DIR_LEN+1]; /* DC12V fan direction */
|
||||
};
|
||||
|
||||
static ssize_t show_string(struct device *dev, struct device_attribute *da, char *buf);
|
||||
static struct as7712_32x_psu_data *as7712_32x_psu_update_device(struct device *dev);
|
||||
|
||||
enum as7712_32x_psu_sysfs_attributes {
|
||||
PSU_PRESENT,
|
||||
PSU_MODEL_NAME,
|
||||
PSU_POWER_GOOD
|
||||
PSU_POWER_GOOD,
|
||||
PSU_FAN_DIR /* For DC12V only */
|
||||
};
|
||||
|
||||
/* sysfs attributes for hwmon
|
||||
*/
|
||||
static SENSOR_DEVICE_ATTR(psu_present, S_IRUGO, show_status, NULL, PSU_PRESENT);
|
||||
static SENSOR_DEVICE_ATTR(psu_model_name, S_IRUGO, show_model_name,NULL, PSU_MODEL_NAME);
|
||||
static SENSOR_DEVICE_ATTR(psu_power_good, S_IRUGO, show_status, NULL, PSU_POWER_GOOD);
|
||||
static SENSOR_DEVICE_ATTR(psu_present, S_IRUGO, show_status, NULL, PSU_PRESENT);
|
||||
static SENSOR_DEVICE_ATTR(psu_model_name, S_IRUGO, show_string, NULL, PSU_MODEL_NAME);
|
||||
static SENSOR_DEVICE_ATTR(psu_power_good, S_IRUGO, show_status, NULL, PSU_POWER_GOOD);
|
||||
static SENSOR_DEVICE_ATTR(psu_fan_dir, S_IRUGO, show_string, NULL, PSU_FAN_DIR);
|
||||
|
||||
static struct attribute *as7712_32x_psu_attributes[] = {
|
||||
&sensor_dev_attr_psu_present.dev_attr.attr,
|
||||
&sensor_dev_attr_psu_model_name.dev_attr.attr,
|
||||
&sensor_dev_attr_psu_power_good.dev_attr.attr,
|
||||
&sensor_dev_attr_psu_fan_dir.dev_attr.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
@@ -83,6 +92,10 @@ static ssize_t show_status(struct device *dev, struct device_attribute *da,
|
||||
struct as7712_32x_psu_data *data = as7712_32x_psu_update_device(dev);
|
||||
u8 status = 0;
|
||||
|
||||
if (!data->valid) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (attr->index == PSU_PRESENT) {
|
||||
status = !(data->status >> (1-data->index) & 0x1);
|
||||
}
|
||||
@@ -93,12 +106,25 @@ static ssize_t show_status(struct device *dev, struct device_attribute *da,
|
||||
return sprintf(buf, "%d\n", status);
|
||||
}
|
||||
|
||||
static ssize_t show_model_name(struct device *dev, struct device_attribute *da,
|
||||
static ssize_t show_string(struct device *dev, struct device_attribute *da,
|
||||
char *buf)
|
||||
{
|
||||
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
|
||||
struct as7712_32x_psu_data *data = as7712_32x_psu_update_device(dev);
|
||||
|
||||
return sprintf(buf, "%s\n", data->model_name);
|
||||
char *ptr = NULL;
|
||||
|
||||
if (!data->valid) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (attr->index == PSU_MODEL_NAME) {
|
||||
ptr = data->model_name;
|
||||
}
|
||||
else { /* PSU_FAN_DIR */
|
||||
ptr = data->fan_dir;
|
||||
}
|
||||
|
||||
return sprintf(buf, "%s\n", ptr);
|
||||
}
|
||||
|
||||
static const struct attribute_group as7712_32x_psu_group = {
|
||||
@@ -195,30 +221,83 @@ static int as7712_32x_psu_read_block(struct i2c_client *client, u8 command, u8 *
|
||||
{
|
||||
int result = 0;
|
||||
int retry_count = 5;
|
||||
|
||||
while (retry_count) {
|
||||
retry_count--;
|
||||
|
||||
result = i2c_smbus_read_i2c_block_data(client, command, data_len, data);
|
||||
|
||||
if (unlikely(result < 0)) {
|
||||
msleep(10);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (unlikely(result != data_len)) {
|
||||
result = -EIO;
|
||||
msleep(10);
|
||||
|
||||
while (retry_count) {
|
||||
retry_count--;
|
||||
|
||||
result = i2c_smbus_read_i2c_block_data(client, command, data_len, data);
|
||||
|
||||
if (unlikely(result < 0)) {
|
||||
msleep(10);
|
||||
continue;
|
||||
}
|
||||
|
||||
result = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (unlikely(result != data_len)) {
|
||||
result = -EIO;
|
||||
msleep(10);
|
||||
continue;
|
||||
}
|
||||
|
||||
result = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
enum psu_type {
|
||||
PSU_TYPE_AC_110V,
|
||||
PSU_TYPE_DC_48V,
|
||||
PSU_TYPE_DC_12V
|
||||
};
|
||||
|
||||
struct model_name_info {
|
||||
enum psu_type type;
|
||||
u8 offset;
|
||||
u8 length;
|
||||
char* model_name;
|
||||
};
|
||||
|
||||
struct model_name_info models[] = {
|
||||
{PSU_TYPE_AC_110V, 0x20, 8, "YM-2651Y"},
|
||||
{PSU_TYPE_DC_48V, 0x20, 8, "YM-2651V"},
|
||||
{PSU_TYPE_DC_12V, 0x00, 11, "PSU-12V-750"},
|
||||
};
|
||||
|
||||
static int as7712_32x_psu_model_name_get(struct device *dev)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct as7712_32x_psu_data *data = i2c_get_clientdata(client);
|
||||
int i, status;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(models); i++) {
|
||||
memset(data->model_name, 0, sizeof(data->model_name));
|
||||
|
||||
status = as7712_32x_psu_read_block(client, models[i].offset,
|
||||
data->model_name, models[i].length);
|
||||
if (status < 0) {
|
||||
data->model_name[0] = '\0';
|
||||
dev_dbg(&client->dev, "unable to read model name from (0x%x) offset(0x%x)\n",
|
||||
client->addr, models[i].offset);
|
||||
return status;
|
||||
}
|
||||
else {
|
||||
data->model_name[models[i].length] = '\0';
|
||||
}
|
||||
|
||||
/* Determine if the model name is known, if not, read next index
|
||||
*/
|
||||
if (strncmp(data->model_name, models[i].model_name, models[i].length) == 0) {
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
data->model_name[0] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
return -ENODATA;
|
||||
}
|
||||
|
||||
static struct as7712_32x_psu_data *as7712_32x_psu_update_device(struct device *dev)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
@@ -229,8 +308,9 @@ static struct as7712_32x_psu_data *as7712_32x_psu_update_device(struct device *d
|
||||
if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
|
||||
|| !data->valid) {
|
||||
int status;
|
||||
int power_good = 0;
|
||||
int power_good = 0;
|
||||
|
||||
data->valid = 0;
|
||||
dev_dbg(&client->dev, "Starting as7712_32x update\n");
|
||||
|
||||
/* Read psu status */
|
||||
@@ -238,25 +318,35 @@ static struct as7712_32x_psu_data *as7712_32x_psu_update_device(struct device *d
|
||||
|
||||
if (status < 0) {
|
||||
dev_dbg(&client->dev, "cpld reg 0x60 err %d\n", status);
|
||||
goto exit;
|
||||
}
|
||||
else {
|
||||
data->status = status;
|
||||
}
|
||||
|
||||
|
||||
/* Read model name */
|
||||
memset(data->model_name, 0, sizeof(data->model_name));
|
||||
memset(data->fan_dir, 0, sizeof(data->fan_dir));
|
||||
power_good = (data->status >> (3-data->index) & 0x1);
|
||||
|
||||
if (power_good) {
|
||||
status = as7712_32x_psu_read_block(client, 0x20, data->model_name,
|
||||
ARRAY_SIZE(data->model_name)-1);
|
||||
|
||||
if (status < 0) {
|
||||
data->model_name[0] = '\0';
|
||||
dev_dbg(&client->dev, "unable to read model name from (0x%x)\n", client->addr);
|
||||
if (power_good) {
|
||||
if (as7712_32x_psu_model_name_get(dev) < 0) {
|
||||
goto exit;
|
||||
}
|
||||
else {
|
||||
data->model_name[ARRAY_SIZE(data->model_name)-1] = '\0';
|
||||
|
||||
if (strncmp(data->model_name,
|
||||
models[PSU_TYPE_DC_12V].model_name,
|
||||
models[PSU_TYPE_DC_12V].length) == 0) {
|
||||
/* Read fan direction */
|
||||
status = as7712_32x_psu_read_block(client, DC12V_FAN_DIR_OFFSET,
|
||||
data->fan_dir, DC12V_FAN_DIR_LEN);
|
||||
|
||||
if (status < 0) {
|
||||
data->fan_dir[0] = '\0';
|
||||
dev_dbg(&client->dev, "unable to read fan direction from (0x%x) offset(0x%x)\n",
|
||||
client->addr, DC12V_FAN_DIR_OFFSET);
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -264,6 +354,7 @@ static struct as7712_32x_psu_data *as7712_32x_psu_update_device(struct device *d
|
||||
data->valid = 1;
|
||||
}
|
||||
|
||||
exit:
|
||||
mutex_unlock(&data->update_lock);
|
||||
|
||||
return data;
|
||||
@@ -271,10 +362,10 @@ static struct as7712_32x_psu_data *as7712_32x_psu_update_device(struct device *d
|
||||
|
||||
static int __init as7712_32x_psu_init(void)
|
||||
{
|
||||
extern int platform_accton_as7712_32x(void);
|
||||
if (!platform_accton_as7712_32x()) {
|
||||
return -ENODEV;
|
||||
}
|
||||
extern int platform_accton_as7712_32x(void);
|
||||
if (!platform_accton_as7712_32x()) {
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return i2c_add_driver(&as7712_32x_psu_driver);
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ x86-64-accton-as7712-32x-r0:
|
||||
--stop=1
|
||||
|
||||
kernel:
|
||||
<<: *kernel-3-16
|
||||
<<: *kernel-3-2
|
||||
|
||||
args: >-
|
||||
nopat
|
||||
|
||||
@@ -11,7 +11,7 @@ class OnlPlatform_x86_64_accton_as7712_32x_r0(OnlPlatformAccton,
|
||||
self.insmod('ym2651y')
|
||||
self.insmod('accton_i2c_cpld')
|
||||
for m in [ 'fan', 'psu', 'leds', 'sfp' ]:
|
||||
self.insmod("x86-64-accton-as7712-32x-%s.ko" % m, required=False)
|
||||
self.insmod("x86-64-accton-as7712-32x-%s.ko" % m)
|
||||
|
||||
########### initialize I2C bus 0 ###########
|
||||
self.new_i2c_devices([
|
||||
|
||||
Reference in New Issue
Block a user