static int q54sj108a2_probe()

in pmbus/q54sj108a2.c [276:400]


static int q54sj108a2_probe(struct i2c_client *client)
{
	struct device *dev = &client->dev;
	u8 buf[I2C_SMBUS_BLOCK_MAX + 1];
	enum chips chip_id;
	int ret, i;
	struct dentry *debugfs;
	struct dentry *q54sj108a2_dir;
	struct q54sj108a2_data *psu;

	if (!i2c_check_functionality(client->adapter,
				     I2C_FUNC_SMBUS_BYTE_DATA |
				     I2C_FUNC_SMBUS_WORD_DATA |
				     I2C_FUNC_SMBUS_BLOCK_DATA))
		return -ENODEV;

	if (client->dev.of_node)
		chip_id = (enum chips)(unsigned long)of_device_get_match_data(dev);
	else
		chip_id = i2c_match_id(q54sj108a2_id, client)->driver_data;

	ret = i2c_smbus_read_block_data(client, PMBUS_MFR_ID, buf);
	if (ret < 0) {
		dev_err(&client->dev, "Failed to read Manufacturer ID\n");
		return ret;
	}
	if (ret != 6 || strncmp(buf, "DELTA", 5)) {
		buf[ret] = '\0';
		dev_err(dev, "Unsupported Manufacturer ID '%s'\n", buf);
		return -ENODEV;
	}

	/*
	 * The chips support reading PMBUS_MFR_MODEL.
	 */
	ret = i2c_smbus_read_block_data(client, PMBUS_MFR_MODEL, buf);
	if (ret < 0) {
		dev_err(dev, "Failed to read Manufacturer Model\n");
		return ret;
	}
	if (ret != 14 || strncmp(buf, "Q54SJ108A2", 10)) {
		buf[ret] = '\0';
		dev_err(dev, "Unsupported Manufacturer Model '%s'\n", buf);
		return -ENODEV;
	}

	ret = i2c_smbus_read_block_data(client, PMBUS_MFR_REVISION, buf);
	if (ret < 0) {
		dev_err(dev, "Failed to read Manufacturer Revision\n");
		return ret;
	}
	if (ret != 4 || buf[0] != 'S') {
		buf[ret] = '\0';
		dev_err(dev, "Unsupported Manufacturer Revision '%s'\n", buf);
		return -ENODEV;
	}

	ret = pmbus_do_probe(client, &q54sj108a2_info[chip_id]);
	if (ret)
		return ret;

	psu = devm_kzalloc(&client->dev, sizeof(*psu), GFP_KERNEL);
	if (!psu)
		return 0;

	psu->client = client;

	debugfs = pmbus_get_debugfs_dir(client);

	q54sj108a2_dir = debugfs_create_dir(client->name, debugfs);

	for (i = 0; i < Q54SJ108A2_DEBUGFS_NUM_ENTRIES; ++i)
		psu->debugfs_entries[i] = i;

	debugfs_create_file("operation", 0644, q54sj108a2_dir,
			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_OPERATION],
			    &q54sj108a2_fops);
	debugfs_create_file("clear_fault", 0200, q54sj108a2_dir,
			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_CLEARFAULT],
			    &q54sj108a2_fops);
	debugfs_create_file("write_protect", 0444, q54sj108a2_dir,
			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_WRITEPROTECT],
			    &q54sj108a2_fops);
	debugfs_create_file("store_default", 0200, q54sj108a2_dir,
			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_STOREDEFAULT],
			    &q54sj108a2_fops);
	debugfs_create_file("vo_ov_response", 0644, q54sj108a2_dir,
			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_VOOV_RESPONSE],
			    &q54sj108a2_fops);
	debugfs_create_file("io_oc_response", 0644, q54sj108a2_dir,
			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_IOOC_RESPONSE],
			    &q54sj108a2_fops);
	debugfs_create_file("pmbus_revision", 0444, q54sj108a2_dir,
			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_PMBUS_VERSION],
			    &q54sj108a2_fops);
	debugfs_create_file("mfr_id", 0444, q54sj108a2_dir,
			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_MFR_ID],
			    &q54sj108a2_fops);
	debugfs_create_file("mfr_model", 0444, q54sj108a2_dir,
			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_MFR_MODEL],
			    &q54sj108a2_fops);
	debugfs_create_file("mfr_revision", 0444, q54sj108a2_dir,
			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_MFR_REVISION],
			    &q54sj108a2_fops);
	debugfs_create_file("mfr_location", 0444, q54sj108a2_dir,
			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_MFR_LOCATION],
			    &q54sj108a2_fops);
	debugfs_create_file("blackbox_erase", 0200, q54sj108a2_dir,
			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_BLACKBOX_ERASE],
			    &q54sj108a2_fops);
	debugfs_create_file("blackbox_read_offset", 0444, q54sj108a2_dir,
			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_BLACKBOX_READ_OFFSET],
			    &q54sj108a2_fops);
	debugfs_create_file("blackbox_set_offset", 0200, q54sj108a2_dir,
			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_BLACKBOX_SET_OFFSET],
			    &q54sj108a2_fops);
	debugfs_create_file("blackbox_read", 0444, q54sj108a2_dir,
			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_BLACKBOX_READ],
			    &q54sj108a2_fops);
	debugfs_create_file("flash_key", 0444, q54sj108a2_dir,
			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_FLASH_KEY],
			    &q54sj108a2_fops);

	return 0;
}