@@ -57,6 +57,23 @@
#define PCA954X_IRQ_OFFSET 4
+/*
+ * MAX7357's configuration register is writeable after POR, but
+ * can be locked by setting the basic mode bit. MAX7358 configuration
+ * register is locked by default and needs to be unlocked first.
+ * The configuration register holds the following settings:
+ */
+#define MAX7357_CONF_INT_ENABLE BIT(0)
+#define MAX7357_CONF_FLUSH_OUT BIT(1)
+#define MAX7357_CONF_RELEASE_INT BIT(2)
+#define MAX7357_CONF_LOCK_UP_CLEAR BIT(3)
+#define MAX7357_CONF_DISCON_SINGLE_CHAN BIT(4)
+#define MAX7357_CONF_BUS_LOCKUP_DETECT_DIS BIT(5)
+#define MAX7357_CONF_ENABLE_BASIC_MODE BIT(6)
+#define MAX7357_CONF_PRECONNECT_TEST BIT(7)
+
+#define MAX7357_POR_DEFAULT_CONF BIT(0)
+
enum pca_type {
max_7356,
max_7357,
@@ -477,6 +494,43 @@ static int pca954x_init(struct i2c_client *client, struct pca954x *data)
return ret;
}
+static int max7357_init(struct i2c_client *client, struct pca954x *data)
+{
+ struct i2c_adapter *adap = client->adapter;
+ u8 conf = MAX7357_POR_DEFAULT_CONF;
+ int ret;
+
+ if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) {
+ dev_warn(&client->dev, "Device not configured: SMBUS_WRITE_BYTE_DATA is unsupported\n");
+ return pca954x_init(client, data);
+ }
+
+ if (data->idle_state >= 0)
+ data->last_chan = pca954x_regval(data, data->idle_state);
+ else
+ data->last_chan = 0; /* Disconnect multiplexer */
+
+ /*
+ * The interrupt signal is shared with the reset pin. Release the
+ * interrupt after 1.6 seconds to allow using the pin as reset.
+ * The interrupt isn't serviced yet.
+ */
+ conf |= MAX7357_CONF_RELEASE_INT;
+
+ if (device_property_read_bool(&client->dev, "maxim,isolate-stuck-channel"))
+ conf |= MAX7357_CONF_DISCON_SINGLE_CHAN;
+ if (device_property_read_bool(&client->dev, "maxim,send-flush-out-sequence"))
+ conf |= MAX7357_CONF_FLUSH_OUT;
+ if (device_property_read_bool(&client->dev, "maxim,preconnection-wiggle-test-enable"))
+ conf |= MAX7357_CONF_PRECONNECT_TEST;
+
+ ret = i2c_smbus_write_byte_data(client, data->last_chan, conf);
+ if (ret < 0)
+ data->last_chan = 0;
+
+ return ret;
+}
+
/*
* I2C init/probing/exit functions
*/
@@ -485,6 +539,7 @@ static int pca954x_probe(struct i2c_client *client)
const struct i2c_device_id *id = i2c_client_get_device_id(client);
struct i2c_adapter *adap = client->adapter;
struct device *dev = &client->dev;
+ struct device_node *node = dev->of_node;
struct gpio_desc *gpio;
struct i2c_mux_core *muxc;
struct pca954x *data;
@@ -560,6 +615,13 @@ static int pca954x_probe(struct i2c_client *client)
* initializes the mux to a channel
* or disconnected state.
*/
+ if ((node && of_device_is_compatible(node, "maxim,max7357")) ||
+ id->driver_data == max_7357)
+ ret = max7357_init(client, data);
+ else if ((node && of_device_is_compatible(node, "maxim,max7358")) ||
+ id->driver_data == max_7358)
+ dev_warn(dev, "Device not configured: unlock sequence not implemented\n");
+
ret = pca954x_init(client, data);
if (ret < 0) {
dev_warn(dev, "probe failed\n");