Esempio n. 1
0
static void max8997_muic_detect_cable_wq(struct work_struct *work)
{
	struct max8997_muic_info *info = container_of(to_delayed_work(work),
				struct max8997_muic_info, wq_detcable);
	int ret;

	ret = max8997_muic_detect_dev(info);
	if (ret < 0)
		dev_err(info->dev, "failed to detect cable type\n");
}
static void max8997_muic_init_detect(struct work_struct *work)
{
	struct max8997_muic_info *info = container_of(work,
			struct max8997_muic_info, init_work.work);

	dev_info(info->dev, "%s\n", __func__);
	mutex_lock(&info->mutex);
	max8997_muic_detect_dev(info);
	mutex_unlock(&info->mutex);
}
static irqreturn_t max8997_muic_irq(int irq, void *data)
{
	struct max8997_muic_info *info = data;
	dev_info(info->dev, "%s: irq:%d\n", __func__, irq);

	mutex_lock(&info->mutex);
	max8997_muic_detect_dev(info, irq);
	mutex_unlock(&info->mutex);

	return IRQ_HANDLED;
}
static int max8997_muic_restore(struct device *dev)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct max8997_muic_info *info;
	int i;
	info = platform_get_drvdata(pdev);

	for (i = 0; i < ARRAY_SIZE(max8997_dumpaddr_muic); i++)
		max8997_write_reg(info->max8997->muic, max8997_dumpaddr_muic[i],
			info->max8997->reg_dump[i + MAX8997_REG_PMIC_END]);

	mutex_lock(&info->mutex);
	max8997_muic_detect_dev(info, -1);
	mutex_unlock(&info->mutex);

	return 0;
}
static int __devinit max8997_muic_probe(struct platform_device *pdev)
{
	struct max8997_dev *iodev = dev_get_drvdata(pdev->dev.parent);
	struct max8997_platform_data *pdata = dev_get_platdata(iodev->dev);
	struct max8997_muic_info *info;
	int ret, i;

	info = kzalloc(sizeof(struct max8997_muic_info), GFP_KERNEL);
	if (!info) {
		dev_err(&pdev->dev, "failed to allocate memory\n");
		ret = -ENOMEM;
		goto err_kfree;
	}

	if (!pdata->muic_pdata) {
		dev_err(&pdev->dev, "failed to get platform_data\n");
		ret = -EINVAL;
		goto err_pdata;
	}
	info->muic_pdata = pdata->muic_pdata;

	info->dev = &pdev->dev;
	info->iodev = iodev;
	info->muic = iodev->muic;

	platform_set_drvdata(pdev, info);
	mutex_init(&info->mutex);

	INIT_WORK(&info->irq_work, max8997_muic_irq_work);

	for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) {
		struct max8997_muic_irq *muic_irq = &muic_irqs[i];

		ret = request_threaded_irq(pdata->irq_base + muic_irq->irq,
				NULL, max8997_muic_irq_handler,
				0, muic_irq->name,
				info);
		if (ret) {
			dev_err(&pdev->dev,
				"failed: irq request (IRQ: %d,"
				" error :%d)\n",
				muic_irq->irq, ret);

			for (i = i - 1; i >= 0; i--)
				free_irq(muic_irq->irq, info);

			goto err_irq;
		}
	}

	
	max8997_initialize_device(info);

	
	max8997_muic_detect_dev(info);

	return ret;

err_irq:
err_pdata:
	kfree(info);
err_kfree:
	return ret;
}