Skip to content

Commit

Permalink
Mellanox system drivers backport to kernel 4.9 (sonic-net#1)
Browse files Browse the repository at this point in the history
* Mellanox system drivers backport to kernel 4.9

This series of patches introduces support for Mellanox systems.
Most of the patches is a backporting from the kernels 4.10 � 4.14
for Mellanox system drivers that have been applied upstream and
a few patches contain current Mellanox upstream work � patches
which are in review process for acceptances for kernels 4.16 � 4.17.
This series introduces Mellanox i2c controller, mux, platform,
hotplug, led, asic drivers, TI voltage controller driver and the
extension of Mellanox kernel config.

In series file all the patches are listed and all old patches, relevant
for old 3.16 kernel are commented out.

Signed-off-by: Vadim Pasternak <vadimp@melanox.com>

* Mellanox system drivers backport to kernel 4.9

This series of patches introduces support for Mellanox systems.
Most of the patches is a backporting from the kernels 4.10 - 4.14
for Mellanox system drivers that have been applied upstream and
a few patches contain current Mellanox upstream work patches
which are in review process for acceptances for kernels 4.16 - 4.17.
This series introduces Mellanox i2c controller, mux, platform,
hotplug, led, asic drivers, TI voltage controller driver and the
extension of Mellanox kernel config.

The patchset includes the bellow commits. And additional we have a code
from two work in progress patchsets, which are supposed to be available in
4.17, in review in:
http://git.infradead.org/users/dvhart/linux-platform-drivers-x86.git
http://git.kernel.org/pub/scm/linux/kernel/git/j.anaszewski/linux-leds.git
This is to make Mellanox drivers architecture independent and also extend
the supported system types, since we have a number of new systems).

commit ae3923a284cc696311294022e9b1a49058f07387
Author: Bhumika Goyal <bhumirks@gmail.com>
Date:   Mon Aug 21 17:42:04 2017 +0530
    i2c: busses: make i2c_adapter_quirks const

commit 26b1083b4545ec08a7dcfe759323a2e142d60d75
Author: Wolfram Sang <wsa@the-dreams.de>
Date:   Mon Aug 14 10:23:26 2017 +0200
    i2c: mux: mlxcpld: move header file out of I2C realm

commit 1da87267006246137a96682404bc0716a10c85a7
Author: Wei Yongjun <weiyongjun1@huawei.com>
Date:   Thu Jan 12 14:29:04 2017 +0000
    i2c: mux: mlxcpld: remove unused including <linux/version.h>

commit 649ac63a9ae5e08b7123f2fa98c2bf42f033bdb9
Author: Peter Rosin <peda@axentia.se>
Date:   Sat Dec 17 21:29:11 2016 +0100
    i2c: mux: mlxcpld: fix i2c mux selection caching

commit c02b7bf532f7e46f1f9a0e9c3c27ca3f6f134e8d
Author: Vadim Pasternak <vadimp@mellanox.com>
Date:   Thu Nov 10 21:26:23 2016 +0000
    i2c: mux: mellanox: add driver

commit dca897e28f364724e42f65cf0262fa367512498d
Author: Vadim Pasternak <vadimp@mellanox.com>
Date:   Thu Nov 3 19:17:19 2016 +0000
    leds: verify vendor and change license in mlxcpld driver

commit be4fdf99fa4dc95aa01144b207caf2cc9fa074d8
Author: Vadim Pasternak <vadimp@mellanox.com>
Date:   Thu Sep 8 07:25:53 2016 +0000
    leds: add driver for Mellanox systems LEDs

commit d70eaa386bf9ecc1e5b3002f64eb59172fcec4fd
Author: Vadim Pasternak <vadimp@mellanox.com>
Date:   Wed, Nov 1 13:10:42 2017 +0200
    mlxsw: i2c: Fix buffer increment counter for write transaction

commit 7ca36994a3479e6d9d81baba34a426c47691ea08
Author: Arkadi Sharshevsky <arkadis@mellanox.com>
Date:   Wed Jun 14 09:27:39 2017 +0200
    mlxsw: reg: Add MCIA register for cable info access

commit 36ca68bf9919299c95ff80e7cf3c217f4c250cbe
Author: Elad Raz <eladr@mellanox.com>
Date:   Mon Jan 9 11:25:44 2017 +0100
    mlxsw: Fix mlxsw_i2c_write return value

commit d556e929164fdc6c94848374fc98c40852f97adb
Author: Vadim Pasternak <vadimp@mellanox.com>
Date:   Wed Nov 16 15:20:46 2016 +0100
    mlxsw: minimal: Add I2C support for Mellanox ASICs

commit 6882b0aee180f2797b8803bdf699aa45c2e5f2d6
Author: Vadim Pasternak <vadimp@mellanox.com>
Date:   Wed Nov 16 15:20:44 2016 +0100
    mlxsw: Introduce support for I2C bus

commit ba20de060094c64a981a4fec8fecc587d076383d
Author: Vadim Pasternak <vadimp@mellanox.com>
Date:   Wed Oct 18 07:26:55 2017 +0000
    platform/x86: move Mellanox hardware platform hotplug driver to platform/mellanox

commit 6faadbbb7f9da70ce484f98f72223c20125a1009
Author: Christoph Hellwig <hch@lst.de>
Date:   Thu Sep 14 11:59:30 2017 +0200
    dmi: Mark all struct dmi_system_id instances const

commit 9a38b67c9877a7371a250454bbbbf521d02fded5
Author: Vadim Pasternak <vadimp@mellanox.com>
Date:   Wed Dec 14 12:05:15 2016 +0000
    platform/x86: mlx-platform: mlxcpld-hotplug driver style fixes

commit 63d762b88cb5510f2bfdb5112ced18cde867ae61
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Sat Jan 7 09:33:34 2017 +0300
    platform/x86: mlx-platform: free first dev on error

commit afc4715901f0dce3206837a7051af05abf5a1e06
Author: Vadim Pasternak <vadimp@mellanox.com>
Date:   Thu Oct 27 19:55:54 2016 +0000
    platform/x86: mlx-platform: Add mlxcpld-hotplug driver registration

commit c3886c9d6076555697551da9b921cf6a6e9cc2b5
Author: kbuild test robot <lkp@intel.com>
Date:   Fri Oct 28 01:26:50 2016 +0800
    platform/x86: mlx-platform: Fix semicolon.cocci warnings

commit 6613d18e90385db5cdbe32fe47567a3c11575b2d
Author: Vadim Pasternak <vadimp@mellanox.com>
Date:   Mon Oct 31 07:22:33 2016 +0000
    platform/x86: mlx-platform: Move module from arch/x86

commit 304887041d953b6692c0d4a9f8fafb252d32e9a0
Author: Vadim Pasternak <vadimp@mellanox.com>
Date:   Thu Oct 20 16:28:01 2016 +0000
    platform/x86: Introduce support for Mellanox hotplug driver

commit d4977c083aeb28cf72c1b019e3f9df13608126dd
Author: Vadim Pasternak <vadimp@mellanox.com>
Date:   Tue Aug 29 20:06:21 2017 +0000
    hwmon: (pmbus) Add support for Intel VID protocol VR13

commit 610526527a13e4c91e64ec3dfb4626c5043291c9
Author: Vadim Pasternak <vadimp@mellanox.com>
Date:   Wed Aug 30 22:02:14 2017 +0000
    hwmon: (pmbus) Add support for Texas Instruments tps53679 device

In series file all the patches are listed and all old patches, relevant
for old 3.16 kernel are commented out.

Signed-off-by: Vadim Pasternak <vadimp@melanox.com>

* Makefile: uncomment line for applying kernel patches and config

This patch uncomments lines in Makefile related to applying patches and
configuration changes

Signed-off-by: Vadim Pasternak <vadimp@mellanox.com>

* config: mellanox kernel configuration

It adds explicit records for new configuration attributes which are not
set in kernel config.

Signed-off-by: Vadim Pasternak <vadimp@mellanox.com>
  • Loading branch information
MellanoxBSP authored and lguohan committed Feb 12, 2018
1 parent c756131 commit 3895ad0
Show file tree
Hide file tree
Showing 11 changed files with 6,799 additions and 34 deletions.
544 changes: 544 additions & 0 deletions patch/0001-i2c-mlxcpld-add-master-driver-for-Mellanox-systems.patch

Large diffs are not rendered by default.

317 changes: 317 additions & 0 deletions patch/0002-i2c-mux-mlxcpld-add-driver-for-Mellanox-systems.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,317 @@
Linux backport patch. Includes following commits:
e3448e71adb1fdd7f403c568ef5c2ed5adf2b197
c3bb77620da428884807fb2f6f3485644e146f84
db5f807ee3dcc779b78f59982cc3e89863069e9c


diff -Nur a/drivers/i2c/muxes/Kconfig b/drivers/i2c/muxes/Kconfig
--- a/drivers/i2c/muxes/Kconfig 2017-11-12 08:13:59.176044126 +0000
+++ b/drivers/i2c/muxes/Kconfig 2017-11-12 08:14:27.992044509 +0000
@@ -82,4 +82,15 @@
demultiplexer that uses the pinctrl subsystem. This is useful if you
want to change the I2C master at run-time depending on features.

+config I2C_MUX_MLXCPLD
+ tristate "Mellanox CPLD based I2C multiplexer"
+ help
+ If you say yes to this option, support will be included for a
+ CPLD based I2C multiplexer. This driver provides access to
+ I2C busses connected through a MUX, which is controlled
+ by a CPLD register.
+
+ This driver can also be built as a module. If so, the module
+ will be called i2c-mux-mlxcpld.
+
endmenu
diff -Nur a/drivers/i2c/muxes/Makefile b/drivers/i2c/muxes/Makefile
--- a/drivers/i2c/muxes/Makefile 2017-11-12 08:13:59.176044126 +0000
+++ b/drivers/i2c/muxes/Makefile 2017-11-12 08:14:27.992044509 +0000
@@ -6,6 +6,7 @@
obj-$(CONFIG_I2C_DEMUX_PINCTRL) += i2c-demux-pinctrl.o

obj-$(CONFIG_I2C_MUX_GPIO) += i2c-mux-gpio.o
+obj-$(CONFIG_I2C_MUX_MLXCPLD) += i2c-mux-mlxcpld.o
obj-$(CONFIG_I2C_MUX_PCA9541) += i2c-mux-pca9541.o
obj-$(CONFIG_I2C_MUX_PCA954x) += i2c-mux-pca954x.o
obj-$(CONFIG_I2C_MUX_PINCTRL) += i2c-mux-pinctrl.o
diff -Nur a/drivers/i2c/muxes/i2c-mux-mlxcpld.c b/drivers/i2c/muxes/i2c-mux-mlxcpld.c
--- a/drivers/i2c/muxes/i2c-mux-mlxcpld.c 1970-01-01 00:00:00.000000000 +0000
+++ b/drivers/i2c/muxes/i2c-mux-mlxcpld.c 2017-11-12 08:14:27.992044509 +0000
@@ -0,0 +1,221 @@
+/*
+ * drivers/i2c/muxes/i2c-mux-mlxcpld.c
+ * Copyright (c) 2016 Mellanox Technologies. All rights reserved.
+ * Copyright (c) 2016 Michael Shych <michaels@mellanox.com>
+ *
+ * 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.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER 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.
+ */
+
+#include <linux/device.h>
+#include <linux/i2c.h>
+#include <linux/i2c-mux.h>
+#include <linux/io.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/i2c/mlxcpld.h>
+
+#define CPLD_MUX_MAX_NCHANS 8
+
+/* mlxcpld_mux - mux control structure:
+ * @last_chan - last register value
+ * @client - I2C device client
+ */
+struct mlxcpld_mux {
+ u8 last_chan;
+ struct i2c_client *client;
+};
+
+/* MUX logic description.
+ * Driver can support different mux control logic, according to CPLD
+ * implementation.
+ *
+ * Connectivity schema.
+ *
+ * i2c-mlxcpld Digital Analog
+ * driver
+ * *--------* * -> mux1 (virt bus2) -> mux -> |
+ * | I2CLPC | i2c physical * -> mux2 (virt bus3) -> mux -> |
+ * | bridge | bus 1 *---------* |
+ * | logic |---------------------> * mux reg * |
+ * | in CPLD| *---------* |
+ * *--------* i2c-mux-mlxpcld ^ * -> muxn (virt busn) -> mux -> |
+ * | driver | |
+ * | *---------------* | Devices
+ * | * CPLD (i2c bus)* select |
+ * | * registers for *--------*
+ * | * mux selection * deselect
+ * | *---------------*
+ * | |
+ * <--------> <----------->
+ * i2c cntrl Board cntrl reg
+ * reg space space (mux select,
+ * IO, LED, WD, info)
+ *
+ */
+
+static const struct i2c_device_id mlxcpld_mux_id[] = {
+ { "mlxcpld_mux_module", 0 },
+ { }
+};
+MODULE_DEVICE_TABLE(i2c, mlxcpld_mux_id);
+
+/* Write to mux register. Don't use i2c_transfer() and i2c_smbus_xfer()
+ * for this as they will try to lock adapter a second time.
+ */
+static int mlxcpld_mux_reg_write(struct i2c_adapter *adap,
+ struct i2c_client *client, u8 val)
+{
+ struct mlxcpld_mux_plat_data *pdata = dev_get_platdata(&client->dev);
+ int ret = -ENODEV;
+
+ if (adap->algo->master_xfer) {
+ struct i2c_msg msg;
+ u8 msgbuf[] = {pdata->sel_reg_addr, val};
+
+ msg.addr = client->addr;
+ msg.flags = 0;
+ msg.len = 2;
+ msg.buf = msgbuf;
+ ret = __i2c_transfer(adap, &msg, 1);
+
+ if (ret >= 0 && ret != 1)
+ ret = -EREMOTEIO;
+ } else if (adap->algo->smbus_xfer) {
+ union i2c_smbus_data data;
+
+ data.byte = val;
+ ret = adap->algo->smbus_xfer(adap, client->addr,
+ client->flags, I2C_SMBUS_WRITE,
+ pdata->sel_reg_addr,
+ I2C_SMBUS_BYTE_DATA, &data);
+ }
+
+ return ret;
+}
+
+static int mlxcpld_mux_select_chan(struct i2c_mux_core *muxc, u32 chan)
+{
+ struct mlxcpld_mux *data = i2c_mux_priv(muxc);
+ struct i2c_client *client = data->client;
+ u8 regval = chan + 1;
+ int err = 0;
+
+ /* Only select the channel if its different from the last channel */
+ if (data->last_chan != regval) {
+ err = mlxcpld_mux_reg_write(muxc->parent, client, regval);
+ data->last_chan = err < 0 ? 0 : regval;
+ }
+
+ return err;
+}
+
+static int mlxcpld_mux_deselect(struct i2c_mux_core *muxc, u32 chan)
+{
+ struct mlxcpld_mux *data = i2c_mux_priv(muxc);
+ struct i2c_client *client = data->client;
+
+ /* Deselect active channel */
+ data->last_chan = 0;
+
+ return mlxcpld_mux_reg_write(muxc->parent, client, data->last_chan);
+}
+
+/* Probe/reomove functions */
+static int mlxcpld_mux_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ struct i2c_adapter *adap = to_i2c_adapter(client->dev.parent);
+ struct mlxcpld_mux_plat_data *pdata = dev_get_platdata(&client->dev);
+ struct i2c_mux_core *muxc;
+ int num, force;
+ struct mlxcpld_mux *data;
+ int err;
+
+ if (!pdata)
+ return -EINVAL;
+
+ if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
+ return -ENODEV;
+
+ muxc = i2c_mux_alloc(adap, &client->dev, CPLD_MUX_MAX_NCHANS,
+ sizeof(*data), 0, mlxcpld_mux_select_chan,
+ mlxcpld_mux_deselect);
+ if (!muxc)
+ return -ENOMEM;
+
+ data = i2c_mux_priv(muxc);
+ i2c_set_clientdata(client, muxc);
+ data->client = client;
+ data->last_chan = 0; /* force the first selection */
+
+ /* Create an adapter for each channel. */
+ for (num = 0; num < CPLD_MUX_MAX_NCHANS; num++) {
+ if (num >= pdata->num_adaps)
+ /* discard unconfigured channels */
+ break;
+
+ force = pdata->adap_ids[num];
+
+ err = i2c_mux_add_adapter(muxc, force, num, 0);
+ if (err)
+ goto virt_reg_failed;
+ }
+
+ return 0;
+
+virt_reg_failed:
+ i2c_mux_del_adapters(muxc);
+ return err;
+}
+
+static int mlxcpld_mux_remove(struct i2c_client *client)
+{
+ struct i2c_mux_core *muxc = i2c_get_clientdata(client);
+
+ i2c_mux_del_adapters(muxc);
+ return 0;
+}
+
+static struct i2c_driver mlxcpld_mux_driver = {
+ .driver = {
+ .name = "mlxcpld-mux",
+ },
+ .probe = mlxcpld_mux_probe,
+ .remove = mlxcpld_mux_remove,
+ .id_table = mlxcpld_mux_id,
+};
+
+module_i2c_driver(mlxcpld_mux_driver);
+
+MODULE_AUTHOR("Michael Shych (michaels@mellanox.com)");
+MODULE_DESCRIPTION("Mellanox I2C-CPLD-MUX driver");
+MODULE_LICENSE("Dual BSD/GPL");
+MODULE_ALIAS("platform:i2c-mux-mlxcpld");
diff -Nur a/include/linux/i2c/mlxcpld.h b/include/linux/i2c/mlxcpld.h
--- a/include/linux/i2c/mlxcpld.h 1970-01-01 00:00:00.000000000 +0000
+++ b/include/linux/i2c/mlxcpld.h 2017-11-12 08:17:03.032046568 +0000
@@ -0,0 +1,52 @@
+/*
+ * mlxcpld.h - Mellanox I2C multiplexer support in CPLD
+ *
+ * Copyright (c) 2016 Mellanox Technologies. All rights reserved.
+ * Copyright (c) 2016 Michael Shych <michaels@mellanox.com>
+ *
+ * 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.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER 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.
+ */
+
+#ifndef _LINUX_I2C_MLXCPLD_H
+#define _LINUX_I2C_MLXCPLD_H
+
+/* Platform data for the CPLD I2C multiplexers */
+
+/* mlxcpld_mux_plat_data - per mux data, used with i2c_register_board_info
+ * @adap_ids - adapter array
+ * @num_adaps - number of adapters
+ * @sel_reg_addr - mux select register offset in CPLD space
+ */
+struct mlxcpld_mux_plat_data {
+ int *adap_ids;
+ int num_adaps;
+ int sel_reg_addr;
+};
+
+#endif /* _LINUX_I2C_MLXCPLD_H */
Loading

0 comments on commit 3895ad0

Please sign in to comment.