Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e892b75f authored by Guenter Roeck's avatar Guenter Roeck
Browse files

hwmon: (atxp1) Drop auto-detection



Auto-detection for this chip is highly unreliable, and one of its
I2C addresses can also be used by EEPROMs, increasing the risk for
false positives even more. Drop auto-detection entirely to remove
the risk.

Reviewed-by: default avatarJean Delvare <jdelvare@suse.de>
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent ea33a5e7
Loading
Loading
Loading
Loading
+9 −46
Original line number Original line Diff line number Diff line
@@ -11,6 +11,10 @@
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * GNU General Public License for more details.
 *
 * The ATXP1 can reside on I2C addresses 0x37 or 0x4e. The chip is
 * not auto-detected by the driver and must be instantiated explicitly.
 * See Documentation/i2c/instantiating-devices for more information.
 */
 */


#include <linux/kernel.h>
#include <linux/kernel.h>
@@ -38,8 +42,6 @@ MODULE_AUTHOR("Sebastian Witt <se.witt@gmx.net>");
#define ATXP1_VIDMASK	0x1f
#define ATXP1_VIDMASK	0x1f
#define ATXP1_GPIO1MASK	0x0f
#define ATXP1_GPIO1MASK	0x0f


static const unsigned short normal_i2c[] = { 0x37, 0x4e, I2C_CLIENT_END };

struct atxp1_data {
struct atxp1_data {
	struct i2c_client *client;
	struct i2c_client *client;
	struct mutex update_lock;
	struct mutex update_lock;
@@ -254,48 +256,6 @@ static struct attribute *atxp1_attrs[] = {
};
};
ATTRIBUTE_GROUPS(atxp1);
ATTRIBUTE_GROUPS(atxp1);


/* Return 0 if detection is successful, -ENODEV otherwise */
static int atxp1_detect(struct i2c_client *new_client,
			struct i2c_board_info *info)
{
	struct i2c_adapter *adapter = new_client->adapter;

	u8 temp;

	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
		return -ENODEV;

	/* Detect ATXP1, checking if vendor ID registers are all zero */
	if (!((i2c_smbus_read_byte_data(new_client, 0x3e) == 0) &&
	     (i2c_smbus_read_byte_data(new_client, 0x3f) == 0) &&
	     (i2c_smbus_read_byte_data(new_client, 0xfe) == 0) &&
	     (i2c_smbus_read_byte_data(new_client, 0xff) == 0)))
		return -ENODEV;

	/*
	 * No vendor ID, now checking if registers 0x10,0x11 (non-existent)
	 * showing the same as register 0x00
	 */
	temp = i2c_smbus_read_byte_data(new_client, 0x00);

	if (!((i2c_smbus_read_byte_data(new_client, 0x10) == temp) &&
	      (i2c_smbus_read_byte_data(new_client, 0x11) == temp)))
		return -ENODEV;

	/* Get VRM */
	temp = vid_which_vrm();

	if ((temp != 90) && (temp != 91)) {
		dev_err(&adapter->dev, "atxp1: Not supporting VRM %d.%d\n",
				temp / 10, temp % 10);
		return -ENODEV;
	}

	strlcpy(info->type, "atxp1", I2C_NAME_SIZE);

	return 0;
}

static int atxp1_probe(struct i2c_client *client,
static int atxp1_probe(struct i2c_client *client,
		       const struct i2c_device_id *id)
		       const struct i2c_device_id *id)
{
{
@@ -309,6 +269,11 @@ static int atxp1_probe(struct i2c_client *client,


	/* Get VRM */
	/* Get VRM */
	data->vrm = vid_which_vrm();
	data->vrm = vid_which_vrm();
	if (data->vrm != 90 && data->vrm != 91) {
		dev_err(dev, "atxp1: Not supporting VRM %d.%d\n",
			data->vrm / 10, data->vrm % 10);
		return -ENODEV;
	}


	data->client = client;
	data->client = client;
	mutex_init(&data->update_lock);
	mutex_init(&data->update_lock);
@@ -337,8 +302,6 @@ static struct i2c_driver atxp1_driver = {
	},
	},
	.probe		= atxp1_probe,
	.probe		= atxp1_probe,
	.id_table	= atxp1_id,
	.id_table	= atxp1_id,
	.detect		= atxp1_detect,
	.address_list	= normal_i2c,
};
};


module_i2c_driver(atxp1_driver);
module_i2c_driver(atxp1_driver);