Skip to content

Commit 4142d7f

Browse files
nealtailguohan
authored andcommitted
[Delta]: Modify delta-ag9032v1 driver for kernel 4.9 (#20)
Signed-off-by: neal tai <[email protected]>
1 parent 025dad0 commit 4142d7f

File tree

8 files changed

+217
-30
lines changed

8 files changed

+217
-30
lines changed

platform/broadcom/rules.mk

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ include $(PLATFORM_PATH)/platform-modules-ingrasys.mk
77
include $(PLATFORM_PATH)/platform-modules-accton.mk
88
include $(PLATFORM_PATH)/platform-modules-inventec.mk
99
include $(PLATFORM_PATH)/platform-modules-cel.mk
10-
#include $(PLATFORM_PATH)/platform-modules-delta.mk
10+
include $(PLATFORM_PATH)/platform-modules-delta.mk
1111
include $(PLATFORM_PATH)/platform-modules-quanta.mk
1212
#include $(PLATFORM_PATH)/platform-modules-mitac.mk
1313
include $(PLATFORM_PATH)/docker-orchagent-brcm.mk
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
obj-m := dni_ag9032v1_psu.o dni_emc2305.o delta_ag9032v1_platform.o delta_ag9032v1_cpupld.o
2-

platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/delta_ag9032v1_platform.c

+196-23
Original file line numberDiff line numberDiff line change
@@ -248,25 +248,25 @@ static struct i2c_device_platform_data ag9032v1_i2c_device_platform_data[] = {
248248
{
249249
/* psu 1 (0x58) */
250250
.parent = 40,
251-
.info = { .type = "dni_ag9032v1_psu", .addr = 0x58, .platform_data = 0 },
251+
.info = { .type = "dni_ag9032v1_psu", .addr = 0x58, .platform_data = (void *) 0 },
252252
.client = NULL,
253253
},
254254
{
255255
/* psu 2 (0x58) */
256256
.parent = 41,
257-
.info = { .type = "dni_ag9032v1_psu", .addr = 0x58, .platform_data = 1 },
257+
.info = { .type = "dni_ag9032v1_psu", .addr = 0x58, .platform_data = (void *) 1 },
258258
.client = NULL,
259259
},
260260
{
261261
/* hot-swap 1 (0x40) */
262262
.parent = 42,
263-
.info = { .type = "ltc4215", .addr = 0x40, .platform_data = 0 },
263+
.info = { .type = "ltc4215", .addr = 0x40, .platform_data = (void *) 0 },
264264
.client = NULL,
265265
},
266266
{
267267
/* hot-swap 2 (0x40) */
268268
.parent = 43,
269-
.info = { .type = "ltc4215", .addr = 0x40, .platform_data = 1 },
269+
.info = { .type = "ltc4215", .addr = 0x40, .platform_data = (void *) 1 },
270270
.client = NULL,
271271
},
272272
{
@@ -1043,22 +1043,22 @@ static ssize_t get_present(struct device *dev, struct device_attribute \
10431043

10441044
ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_PRESENCE_1);
10451045
if (ret < 0)
1046-
return sprintf(buf, "error number(%ld)",ret);
1046+
return sprintf(buf, "error number(%d)",ret);
10471047
data = (u32)reverse_8bits(ret) & 0xff;
10481048

10491049
ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_PRESENCE_2);
10501050
if (ret < 0)
1051-
return sprintf(buf, "error number(%ld)",ret);
1051+
return sprintf(buf, "error number(%d)",ret);
10521052
data |= (u32)(reverse_8bits(ret) & 0xff) << 8;
10531053

10541054
ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_PRESENCE_3);
10551055
if (ret < 0)
1056-
return sprintf(buf, "error number(%ld)",ret);
1056+
return sprintf(buf, "error number(%d)",ret);
10571057
data |= (u32)(reverse_8bits(ret) & 0xff) << 16;
10581058

10591059
ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_PRESENCE_4);
10601060
if (ret < 0)
1061-
return sprintf(buf, "error number(%ld)",ret);
1061+
return sprintf(buf, "error number(%d)",ret);
10621062
data |= (u32)(reverse_8bits(ret) & 0xff) << 24;
10631063

10641064
return sprintf(buf, "0x%08x\n", data); //return 32bits data
@@ -1072,22 +1072,22 @@ static ssize_t get_lpmode(struct device *dev, struct device_attribute *devattr,
10721072

10731073
ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_LP_MODE_1);
10741074
if (ret < 0)
1075-
return sprintf(buf, "error number(%ld)",ret);
1075+
return sprintf(buf, "error number(%d)",ret);
10761076
data = (u32)(reverse_8bits(ret) & 0xff);
10771077

10781078
ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_LP_MODE_2);
10791079
if (ret < 0)
1080-
return sprintf(buf, "error number(%ld)",ret);
1080+
return sprintf(buf, "error number(%d)",ret);
10811081
data |= (u32)(reverse_8bits(ret) & 0xff) << 8;
10821082

10831083
ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_LP_MODE_3);
10841084
if (ret < 0)
1085-
return sprintf(buf, "error number(%ld)",ret);
1085+
return sprintf(buf, "error number(%d)",ret);
10861086
data |= (u32)(reverse_8bits(ret) & 0xff) << 16;
10871087

10881088
ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_LP_MODE_4);
10891089
if (ret < 0)
1090-
return sprintf(buf, "error number(%ld)",ret);
1090+
return sprintf(buf, "error number(%d)",ret);
10911091
data |= (u32)(reverse_8bits(ret) & 0xff) << 24;
10921092

10931093
return sprintf(buf, "0x%08x\n", data); //return 32bits data
@@ -1119,22 +1119,22 @@ static ssize_t get_reset(struct device *dev, struct device_attribute *devattr, c
11191119

11201120
ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_RESET_1);
11211121
if (ret < 0)
1122-
return sprintf(buf, "error number(%ld)",ret);
1122+
return sprintf(buf, "error number(%d)",ret);
11231123
data = (u32)(reverse_8bits(ret) & 0xff);
11241124

11251125
ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_RESET_2);
11261126
if (ret < 0)
1127-
return sprintf(buf, "error number(%ld)",ret);
1127+
return sprintf(buf, "error number(%d)",ret);
11281128
data |= (u32)(reverse_8bits(ret) & 0xff) << 8;
11291129

11301130
ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_RESET_3);
11311131
if (ret < 0)
1132-
return sprintf(buf, "error number(%ld)",ret);
1132+
return sprintf(buf, "error number(%d)",ret);
11331133
data |= (u32)(reverse_8bits(ret) & 0xff) << 16;
11341134

11351135
ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_RESET_4);
11361136
if (ret < 0)
1137-
return sprintf(buf, "error number(%ld)",ret);
1137+
return sprintf(buf, "error number(%d)",ret);
11381138
data |= (u32)(reverse_8bits(ret) & 0xff) << 24;
11391139

11401140
return sprintf(buf, "0x%08x\n", data); //return 32bits data
@@ -1166,22 +1166,22 @@ static ssize_t get_response(struct device *dev, struct device_attribute *devattr
11661166

11671167
ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_RESPONSE_1);
11681168
if (ret < 0)
1169-
return sprintf(buf, "error number(%ld)",ret);
1169+
return sprintf(buf, "error number(%d)",ret);
11701170
data = (u32)(reverse_8bits(ret) & 0xff);
11711171

11721172
ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_RESPONSE_2);
11731173
if (ret < 0)
1174-
return sprintf(buf, "error number(%ld)",ret);
1174+
return sprintf(buf, "error number(%d)",ret);
11751175
data |= (u32)(reverse_8bits(ret) & 0xff) << 8;
11761176

11771177
ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_RESPONSE_3);
11781178
if (ret < 0)
1179-
return sprintf(buf, "error number(%ld)",ret);
1179+
return sprintf(buf, "error number(%d)",ret);
11801180
data |= (u32)(reverse_8bits(ret) & 0xff) << 16;
11811181

11821182
ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_RESPONSE_4);
11831183
if (ret < 0)
1184-
return sprintf(buf, "error number(%ld)",ret);
1184+
return sprintf(buf, "error number(%d)",ret);
11851185
data |= (u32)(reverse_8bits(ret) & 0xff) << 24;
11861186

11871187
return sprintf(buf, "0x%08x\n", data); //return 32bits data
@@ -2048,6 +2048,7 @@ static int cpld_reg_write_byte(struct i2c_client *client, u8 regaddr, u8 val)
20482048
regaddr, I2C_SMBUS_BYTE_DATA, &data);
20492049
}
20502050

2051+
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
20512052
static int swpld_mux_select(struct i2c_adapter *adap, void *data, u8 chan)
20522053
{
20532054
struct swpld_mux *mux = data;
@@ -2123,7 +2124,86 @@ static int swpld_mux_select(struct i2c_adapter *adap, void *data, u8 chan)
21232124
}
21242125
return cpld_reg_write_byte(mux->data.cpld, mux->data.reg_addr, (u8)(swpld_mux_val & 0xff));
21252126
}
2127+
#else // #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
2128+
static int swpld_mux_select(struct i2c_mux_core *muxc, u32 chan)
2129+
{
2130+
struct swpld_mux *mux = i2c_mux_priv(muxc);
2131+
u8 swpld_mux_val=0;
2132+
2133+
if ( mux->data.base_nr == BUS3_BASE_NUM )
2134+
{
2135+
switch (chan) {
2136+
case 0:
2137+
swpld_mux_val = TEMP_FAN_VAL;
2138+
break;
2139+
case 1:
2140+
swpld_mux_val = FAN_EEPROM1_VAL;
2141+
break;
2142+
case 2:
2143+
swpld_mux_val = FAN_EEPROM2_VAL;
2144+
break;
2145+
case 3:
2146+
swpld_mux_val = FAN_EEPROM3_VAL;
2147+
break;
2148+
case 4:
2149+
swpld_mux_val = FAN_EEPROM4_VAL;
2150+
break;
2151+
case 5:
2152+
swpld_mux_val = FAN_EEPROM5_VAL;
2153+
break;
2154+
case 6:
2155+
swpld_mux_val = FANIO_CTL_VAL;
2156+
break;
2157+
case 7:
2158+
case 8:
2159+
swpld_mux_val = FAN_CTRL_VAL;
2160+
break;
2161+
}
2162+
}
2163+
else if ( mux->data.base_nr == BUS4_BASE_NUM )
2164+
{
2165+
switch (chan) {
2166+
case 0:
2167+
swpld_mux_val = PSU1_VAL;
2168+
break;
2169+
case 1:
2170+
swpld_mux_val = PSU2_VAL;
2171+
break;
2172+
case 2:
2173+
swpld_mux_val = HOT_SWAP1_VAL;
2174+
break;
2175+
case 3:
2176+
swpld_mux_val = HOT_SWAP2_VAL;
2177+
break;
2178+
}
2179+
}
2180+
else if ( mux->data.base_nr == BUS5_BASE_NUM ){
2181+
if (chan < 9){
2182+
swpld_mux_val = (u8)(chan) + 0x01;
2183+
}
2184+
else if (8 < chan && chan < 19){
2185+
swpld_mux_val = (u8)(chan - 9) + 0x10;
2186+
}
2187+
else if (18 < chan && chan < 29){
2188+
swpld_mux_val = (u8)(chan - 19) + 0x20;
2189+
}
2190+
else if (28 < chan && chan < 39){
2191+
swpld_mux_val = (u8)(chan - 29) + 0x30;
2192+
}
2193+
else{
2194+
swpld_mux_val = 0x00;
2195+
}
2196+
}
2197+
else
2198+
{
2199+
swpld_mux_val = 0x00;
2200+
}
2201+
2202+
return cpld_reg_write_byte(mux->data.cpld, mux->data.reg_addr, (u8)(swpld_mux_val & 0xff));
2203+
}
2204+
#endif // #if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
21262205

2206+
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
21272207
static int __init swpld_mux_probe(struct platform_device *pdev)
21282208
{
21292209
struct swpld_mux *mux;
@@ -2202,8 +2282,89 @@ static int __init swpld_mux_probe(struct platform_device *pdev)
22022282

22032283
return ret;
22042284
}
2285+
#else // #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
2286+
static int __init swpld_mux_probe(struct platform_device *pdev)
2287+
{
2288+
struct i2c_mux_core *muxc;
2289+
struct swpld_mux *mux;
2290+
struct swpld_mux_platform_data *pdata;
2291+
struct i2c_adapter *parent;
2292+
int i, ret, dev_num;
2293+
2294+
pdata = pdev->dev.platform_data;
2295+
if (!pdata) {
2296+
dev_err(&pdev->dev, "SWPLD platform data not found\n");
2297+
return -ENODEV;
2298+
}
2299+
2300+
mux = kzalloc(sizeof(*mux), GFP_KERNEL);
2301+
if (!mux) {
2302+
printk(KERN_ERR "Failed to allocate memory for mux\n");
2303+
return -ENOMEM;
2304+
}
2305+
mux->data = *pdata;
2306+
2307+
parent = i2c_get_adapter(pdata->parent);
2308+
if (!parent) {
2309+
kfree(mux);
2310+
dev_err(&pdev->dev, "Parent adapter (%d) not found\n", pdata->parent);
2311+
return -ENODEV;
2312+
}
2313+
2314+
/* Judge bus number to decide how many devices*/
2315+
switch (pdata->parent) {
2316+
case BUS3:
2317+
dev_num = BUS3_DEV_NUM;
2318+
break;
2319+
case BUS4:
2320+
dev_num = BUS4_DEV_NUM;
2321+
break;
2322+
case BUS5:
2323+
dev_num = BUS5_DEV_NUM;
2324+
break;
2325+
default :
2326+
dev_num = DEFAULT_NUM;
2327+
break;
2328+
}
2329+
2330+
2331+
2332+
muxc = i2c_mux_alloc(parent, &pdev->dev, dev_num, 0, 0,
2333+
swpld_mux_select, NULL);
2334+
if (!muxc) {
2335+
ret = -ENOMEM;
2336+
goto alloc_failed;
2337+
}
2338+
muxc->priv = mux;
2339+
platform_set_drvdata(pdev, muxc);
2340+
2341+
2342+
for (i = 0; i < dev_num; i++) {
2343+
int nr = pdata->base_nr + i;
2344+
unsigned int class = 0;
2345+
2346+
ret = i2c_mux_add_adapter(muxc, nr, i, class);
2347+
if (ret) {
2348+
dev_err(&pdev->dev, "Failed to add adapter %d\n", i);
2349+
goto add_adapter_failed;
2350+
}
2351+
}
22052352

2353+
dev_info(&pdev->dev, "%d port mux on %s adapter\n", dev_num, parent->name);
22062354

2355+
return 0;
2356+
2357+
add_adapter_failed:
2358+
i2c_mux_del_adapters(muxc);
2359+
alloc_failed:
2360+
kfree(mux);
2361+
i2c_put_adapter(parent);
2362+
2363+
return ret;
2364+
}
2365+
#endif // #if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
2366+
2367+
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
22072368
static int __exit swpld_mux_remove(struct platform_device *pdev)
22082369
{
22092370
int i;
@@ -2249,6 +2410,18 @@ static int __exit swpld_mux_remove(struct platform_device *pdev)
22492410

22502411
return 0;
22512412
}
2413+
#else // #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
2414+
static int __exit swpld_mux_remove(struct platform_device *pdev)
2415+
{
2416+
struct i2c_mux_core *muxc = platform_get_drvdata(pdev);
2417+
struct i2c_adapter *parent=muxc->parent;
2418+
2419+
i2c_mux_del_adapters(muxc);
2420+
i2c_put_adapter(parent);
2421+
2422+
return 0;
2423+
}
2424+
#endif
22522425

22532426
static struct platform_driver swpld_mux_driver = {
22542427
.probe = swpld_mux_probe,
@@ -2261,9 +2434,9 @@ static struct platform_driver swpld_mux_driver = {
22612434
/*---------------- MUX - end ------------- */
22622435

22632436
/*---------------- module initialization ------------- */
2264-
static void __init delta_ag9032v1_platform_init(void)
2437+
static int __init delta_ag9032v1_platform_init(void)
22652438
{
2266-
struct i2c_client *client;
2439+
// struct i2c_client *client;
22672440
struct i2c_adapter *adapter;
22682441
struct cpld_platform_data *cpld_pdata;
22692442
struct swpld_mux_platform_data *swpld_mux_pdata;
@@ -2342,7 +2515,7 @@ static void __init delta_ag9032v1_platform_init(void)
23422515
for (; i >= 0; i--) {
23432516
platform_device_unregister(&ag9032v1_swpld_mux[i]);
23442517
}
2345-
platform_driver_unregister(&ag9032v1_cpld);
2518+
platform_driver_unregister((struct platform_driver *) &ag9032v1_cpld);
23462519
error_ag9032v1_cpld:
23472520
platform_driver_unregister(&i2c_device_driver);
23482521
error_i2c_device_driver:

0 commit comments

Comments
 (0)