Example #1
0
static int wm8400_register_codec(struct wm8400 *wm8400)
{
	const struct mfd_cell cell = {
		.name = "wm8400-codec",
		.platform_data = wm8400,
		.pdata_size = sizeof(*wm8400),
	};

	return devm_mfd_add_devices(wm8400->dev, -1, &cell, 1, NULL, 0, NULL);
}

/*
 * wm8400_init - Generic initialisation
 *
 * The WM8400 can be configured as either an I2C or SPI device.  Probe
 * functions for each bus set up the accessors then call into this to
 * set up the device itself.
 */
static int wm8400_init(struct wm8400 *wm8400,
		       struct wm8400_platform_data *pdata)
{
	unsigned int reg;
	int ret;

	dev_set_drvdata(wm8400->dev, wm8400);

	/* Check that this is actually a WM8400 */
	ret = regmap_read(wm8400->regmap, WM8400_RESET_ID, &reg);
	if (ret != 0) {
		dev_err(wm8400->dev, "Chip ID register read failed\n");
		return -EIO;
	}
	if (reg != 0x6172) {
		dev_err(wm8400->dev, "Device is not a WM8400, ID is %x\n",
			reg);
		return -ENODEV;
	}

	ret = regmap_read(wm8400->regmap, WM8400_ID, &reg);
	if (ret != 0) {
		dev_err(wm8400->dev, "ID register read failed: %d\n", ret);
		return ret;
	}
	reg = (reg & WM8400_CHIP_REV_MASK) >> WM8400_CHIP_REV_SHIFT;
	dev_info(wm8400->dev, "WM8400 revision %x\n", reg);

	ret = wm8400_register_codec(wm8400);
	if (ret != 0) {
		dev_err(wm8400->dev, "Failed to register codec\n");
		return ret;
	}

	if (pdata && pdata->platform_init) {
		ret = pdata->platform_init(wm8400->dev);
		if (ret != 0) {
			dev_err(wm8400->dev, "Platform init failed: %d\n",
				ret);
			return ret;
		}
	} else
		dev_warn(wm8400->dev, "No platform initialisation supplied\n");

	return 0;
}
Example #2
0
static int wm8400_register_codec(struct wm8400 *wm8400)
{
    struct mfd_cell cell = {
        .name = "wm8400-codec",
        .platform_data = wm8400,
        .pdata_size = sizeof(*wm8400),
    };

    return mfd_add_devices(wm8400->dev, -1, &cell, 1, NULL, 0);
}

/*
 * wm8400_init - Generic initialisation
 *
 * The WM8400 can be configured as either an I2C or SPI device.  Probe
 * functions for each bus set up the accessors then call into this to
 * set up the device itself.
 */
static int wm8400_init(struct wm8400 *wm8400,
                       struct wm8400_platform_data *pdata)
{
    u16 reg;
    int ret, i;

    mutex_init(&wm8400->io_lock);

    dev_set_drvdata(wm8400->dev, wm8400);

    /* Check that this is actually a WM8400 */
    ret = regmap_read(wm8400->regmap, WM8400_RESET_ID, &i);
    if (ret != 0) {
        dev_err(wm8400->dev, "Chip ID register read failed\n");
        return -EIO;
    }
    if (i != reg_data[WM8400_RESET_ID].default_val) {
        dev_err(wm8400->dev, "Device is not a WM8400, ID is %x\n",
                reg);
        return -ENODEV;
    }

    /* We don't know what state the hardware is in and since this
     * is a PMIC we can't reset it safely so initialise the register
     * cache from the hardware.
     */
    ret = regmap_raw_read(wm8400->regmap, 0, wm8400->reg_cache,
                          ARRAY_SIZE(wm8400->reg_cache));
    if (ret != 0) {
        dev_err(wm8400->dev, "Register cache read failed\n");
        return -EIO;
    }
    for (i = 0; i < ARRAY_SIZE(wm8400->reg_cache); i++)
        wm8400->reg_cache[i] = be16_to_cpu(wm8400->reg_cache[i]);

    /* If the codec is in reset use hard coded values */
    if (!(wm8400->reg_cache[WM8400_POWER_MANAGEMENT_1] & WM8400_CODEC_ENA))
        for (i = 0; i < ARRAY_SIZE(wm8400->reg_cache); i++)
            if (reg_data[i].is_codec)
                wm8400->reg_cache[i] = reg_data[i].default_val;

    ret = wm8400_read(wm8400, WM8400_ID, 1, &reg);
    if (ret != 0) {
        dev_err(wm8400->dev, "ID register read failed: %d\n", ret);
        return ret;
    }
    reg = (reg & WM8400_CHIP_REV_MASK) >> WM8400_CHIP_REV_SHIFT;
    dev_info(wm8400->dev, "WM8400 revision %x\n", reg);

    ret = wm8400_register_codec(wm8400);
    if (ret != 0) {
        dev_err(wm8400->dev, "Failed to register codec\n");
        goto err_children;
    }

    if (pdata && pdata->platform_init) {
        ret = pdata->platform_init(wm8400->dev);
        if (ret != 0) {
            dev_err(wm8400->dev, "Platform init failed: %d\n",
                    ret);
            goto err_children;
        }
    } else
        dev_warn(wm8400->dev, "No platform initialisation supplied\n");

    return 0;

err_children:
    mfd_remove_devices(wm8400->dev);
    return ret;
}
Example #3
0
static int wm8400_register_codec(struct wm8400 *wm8400)
{
	struct mfd_cell cell = {
		.name = "wm8400-codec",
		.driver_data = wm8400,
	};

	return mfd_add_devices(wm8400->dev, -1, &cell, 1, NULL, 0);
}


static int wm8400_init(struct wm8400 *wm8400,
		       struct wm8400_platform_data *pdata)
{
	u16 reg;
	int ret, i;

	mutex_init(&wm8400->io_lock);

	dev_set_drvdata(wm8400->dev, wm8400);

	
	ret = wm8400->read_dev(wm8400->io_data, WM8400_RESET_ID, 1, &reg);
	if (ret != 0) {
		dev_err(wm8400->dev, "Chip ID register read failed\n");
		return -EIO;
	}
	if (be16_to_cpu(reg) != reg_data[WM8400_RESET_ID].default_val) {
		dev_err(wm8400->dev, "Device is not a WM8400, ID is %x\n",
			be16_to_cpu(reg));
		return -ENODEV;
	}

	
	ret = wm8400->read_dev(wm8400->io_data, 0,
			       ARRAY_SIZE(wm8400->reg_cache),
			       wm8400->reg_cache);
	if (ret != 0) {
		dev_err(wm8400->dev, "Register cache read failed\n");
		return -EIO;
	}
	for (i = 0; i < ARRAY_SIZE(wm8400->reg_cache); i++)
		wm8400->reg_cache[i] = be16_to_cpu(wm8400->reg_cache[i]);

	
	if (!(wm8400->reg_cache[WM8400_POWER_MANAGEMENT_1] & WM8400_CODEC_ENA))
		for (i = 0; i < ARRAY_SIZE(wm8400->reg_cache); i++)
			if (reg_data[i].is_codec)
				wm8400->reg_cache[i] = reg_data[i].default_val;

	ret = wm8400_read(wm8400, WM8400_ID, 1, &reg);
	if (ret != 0) {
		dev_err(wm8400->dev, "ID register read failed: %d\n", ret);
		return ret;
	}
	reg = (reg & WM8400_CHIP_REV_MASK) >> WM8400_CHIP_REV_SHIFT;
	dev_info(wm8400->dev, "WM8400 revision %x\n", reg);

	ret = wm8400_register_codec(wm8400);
	if (ret != 0) {
		dev_err(wm8400->dev, "Failed to register codec\n");
		goto err_children;
	}

	if (pdata && pdata->platform_init) {
		ret = pdata->platform_init(wm8400->dev);
		if (ret != 0) {
			dev_err(wm8400->dev, "Platform init failed: %d\n",
				ret);
			goto err_children;
		}
	} else
		dev_warn(wm8400->dev, "No platform initialisation supplied\n");

	return 0;

err_children:
	mfd_remove_devices(wm8400->dev);
	return ret;
}