コード例 #1
0
static int __devinit imx_wm1808_audio_probe(struct platform_device *pdev)
{
	struct snd_soc_machine **machine = platform_get_drvdata(pdev);
	struct snd_soc_pcm_link *hifi;
	struct mxc_audio_platform_data *tmp;
	int ret, hp_status;

	dbg("%s: pdev->name=%s, machine->pcm_links=%d", __func__, 
		pdev->name, (*machine)->pcm_links);

	(*machine)->owner = THIS_MODULE;
	(*machine)->pdev = pdev;
	(*machine)->name = "i.MX_SAMSUNG";
	(*machine)->longname = "WM1808";
	(*machine)->ops = &machine_ops;

	/* register card */
	ret =
	    snd_soc_new_card(*machine, 1, SNDRV_DEFAULT_IDX1,
			     SNDRV_DEFAULT_STR1);
	if (ret < 0) {
		err("%s: failed to create pcms\n", __func__);
		return ret;
	}

	/* WM1808 hifi interface */
	ret = -ENODEV;
	tmp = pdev->dev.platform_data;

	if (tmp->src_port == 2)
		hifi = snd_soc_pcm_link_new(*machine, "imx_3stack-hifi",
					    &imx_3stack_pcm_ops, imx_pcm,
					    wm1808_codec, wm1808_hifi_dai,
					    imx_ssi_3);
	else
		hifi = snd_soc_pcm_link_new(*machine, "imx_3stack-hifi",
					    &imx_3stack_pcm_ops, imx_pcm,
					    wm1808_codec, wm1808_hifi_dai,
					    imx_ssi_1);
	if (hifi == NULL) {
		dbg("failed to create HiFi PCM link");
		snd_soc_machine_free(*machine);
		return ret;
	}
	ret = snd_soc_pcm_link_attach(hifi);
	if (ret < 0) {
		dbg("%s: failed to attach hifi pcm", __func__);
		snd_soc_machine_free(*machine);
		return ret;
	}
	gpio_activate_audio_ports();

	imx_3stack_init_dam(tmp->src_port, tmp->ext_port);

	return ret;

}
コード例 #2
0
static int __devinit imx_3stack_sgtl5000_audio_probe(struct platform_device *pdev)
{
	struct snd_soc_machine *machine;
	struct mxc_sgtl5000_platform_data *plat = pdev->dev.platform_data;
	struct snd_soc_pcm_link *audio;
	int ret;

	machine = kzalloc(sizeof(struct snd_soc_machine), GFP_KERNEL);
	if (machine == NULL)
		return -ENOMEM;

	platform_set_drvdata(pdev, machine);
	machine->owner = THIS_MODULE;
	machine->pdev = pdev;
	machine->name = "i.MX_3STACK";
	machine->longname = "SGTL5000";
	machine->ops = &machine_ops;

	/* register card */
	ret =
	    snd_soc_new_card(machine, 1, SNDRV_DEFAULT_IDX1,
			     SNDRV_DEFAULT_STR1);
	if (ret < 0) {
		pr_err("%s: failed to create pcms\n", __func__);
		goto err;
	}

	/* SGTL5000 interface */
	ret = -ENODEV;

	if (plat->src_port == 2)
		audio = snd_soc_pcm_link_new(machine, "imx_3stack-audio",
					    &imx_3stack_pcm_ops, imx_pcm,
					    sgtl5000_codec, sgtl5000_dai,
					    imx_ssi_3);
	else
		audio = snd_soc_pcm_link_new(machine, "imx_3stack-audio",
					    &imx_3stack_pcm_ops, imx_pcm,
					    sgtl5000_codec, sgtl5000_dai,
					    imx_ssi_1);
	if (audio == NULL) {
		pr_err("failed to create PCM link\n");
		goto link_err;
	}
	ret = snd_soc_pcm_link_attach(audio);
	if (ret < 0) {
		pr_err("%s: failed to attach audio pcm\n", __func__);
		goto link_err;
	}

	ret = driver_create_file(pdev->dev.driver, &driver_attr_headphone);
	if (ret < 0) {
		pr_err("%s:failed to create driver_attr_headphone\n", __func__);
		goto sysfs_err;
	}

	return ret;

sysfs_err:
	driver_remove_file(pdev->dev.driver, &driver_attr_headphone);
link_err:
	snd_soc_machine_free(machine);
err:
	kfree(machine);
	return ret;

}
コード例 #3
0
/*
 * This function will register the snd_soc_pcm_link drivers.
 * It also registers devices for platform DMA, I2S, SSP and registers an
 * I2C driver to probe the codec.
 */
static int __init imx_3stack_bt_probe(struct platform_device *pdev)
{
	struct snd_soc_machine *machine;
	struct mxc_audio_platform_data *dev_data = pdev->dev.platform_data;
	struct snd_soc_pcm_link *bt_audio;
	const char *ssi_port;
	int ret;
	static int dev;

	if (dev >= SNDRV_CARDS)
		return -ENODEV;
	if (!enable[dev]) {
		dev++;
		return -ENOENT;
	}

	machine = kzalloc(sizeof(struct snd_soc_machine), GFP_KERNEL);
	if (machine == NULL)
		return -ENOMEM;

	machine->owner = THIS_MODULE;
	machine->pdev = pdev;
	machine->name = "imx_3stack";
	machine->longname = "bluetooth";
	machine->ops = &imx_3stack_mach_ops;
	machine->private_data = dev_data;
	pdev->dev.driver_data = machine;

	/* register card */
	imx_3stack_mach = machine;
	ret = snd_soc_new_card(machine, 1, index[dev], id[dev]);
	if (ret < 0) {
		pr_err("%s: failed to create bt sound card\n", __func__);
		goto err;
	}

	/* imx_3stack bluetooth audio interface */
	if (dev_data->src_port == 1)
		ssi_port = imx_ssi_1;
	else
		ssi_port = imx_ssi_3;
	bt_audio =
	    snd_soc_pcm_link_new(machine,
				 "imx_3stack-bt", &bt_pcm,
				 imx_pcm, bt_codec, bt_dai, ssi_port);
	if (bt_audio == NULL) {
		pr_err("Failed to create bt PCM link\n");
		goto err;
	}
	ret = snd_soc_pcm_link_attach(bt_audio);

	if (ret < 0)
		goto link_err;

	return ret;

link_err:
	snd_soc_machine_free(machine);
err:
	kfree(machine);
	return ret;
}
コード例 #4
0
static int __init imx_3stack_audio_probe(struct platform_device *pdev)
{
	struct snd_soc_machine *machine;
	struct mxc_audio_platform_data *dev_data = pdev->dev.platform_data;
	struct snd_soc_pcm_link *hifi;
	const char *ssi_port;
	int ret;

	machine = kzalloc(sizeof(struct snd_soc_machine), GFP_KERNEL);
	if (machine == NULL)
		return -ENOMEM;

	machine->owner = THIS_MODULE;
	machine->pdev = pdev;
	machine->name = "i.MX_3STACK";
	machine->longname = "WM8903";
	machine->ops = &imx_3stack_mach_ops;
	pdev->dev.driver_data = machine;

	/* register card */
	imx_3stack_mach = machine;
	ret = snd_soc_new_card(machine, 1, SNDRV_DEFAULT_IDX1,
			       SNDRV_DEFAULT_STR1);
	if (ret < 0) {
		pr_err("%s: failed to create stereo sound card\n", __func__);
		goto err;
	}

	if (dev_data->src_port == 2)
		ssi_port = imx_ssi_3;
	else
		ssi_port = imx_ssi_1;

	hifi = snd_soc_pcm_link_new(machine, "imx_3stack-hifi",
				    &imx_3stack_pcm_ops, imx_pcm,
				    "wm8903-codec", "wm8903-hifi-dai",
				    ssi_port);

	if (hifi == NULL) {
		pr_err("Failed to create HiFi PCM link\n");
		snd_soc_machine_free(machine);
		goto err;
	}

	ret = snd_soc_pcm_link_attach(hifi);
	hifi->private_data = dev_data;
	if (ret < 0)
		goto link_err;

	imx_3stack_init_dam(dev_data->src_port, dev_data->ext_port);

	ret = driver_create_file(pdev->dev.driver, &driver_attr_headphone);
	if (ret < 0)
		goto sysfs_err;

	return ret;

sysfs_err:
	driver_remove_file(pdev->dev.driver, &driver_attr_headphone);

link_err:
	snd_soc_machine_free(machine);

err:
	kfree(machine);
	return ret;
}
コード例 #5
0
/*
 * This function will register the snd_soc_pcm_link drivers.
 * It also registers devices for platform DMA, I2S, SSP and registers an
 * I2C driver to probe the codec.
 */
static int __init imx_3stack_ak4647_probe(struct platform_device *pdev)
{
	struct snd_soc_machine *machine;
	struct mxc_audio_platform_data *dev_data = pdev->dev.platform_data;
	struct snd_soc_pcm_link *hifi;
	const char *ssi_port;
	int ret;

	machine = kzalloc(sizeof(struct snd_soc_machine), GFP_KERNEL);
	if (machine == NULL)
		return -ENOMEM;

	machine->owner = THIS_MODULE;
	machine->pdev = pdev;
	machine->name = "imx_3stack";
	machine->longname = "ak4647";
	machine->ops = &imx_3stack_mach_ops;
	pdev->dev.driver_data = machine;

	/* register card */
	imx_3stack_mach = machine;
	ret =
	    snd_soc_new_card(machine, 1, SNDRV_DEFAULT_IDX1,
			     SNDRV_DEFAULT_STR1);
	if (ret < 0) {
		pr_err("%s: failed to create stereo sound card\n", __func__);
		goto err;
	}

	pmic_gpio_set_bit_val(MCU_GPIO_REG_RESET_2, 1, 0);
	msleep(1);
	pmic_gpio_set_bit_val(MCU_GPIO_REG_RESET_2, 1, 1);

	/* imx_3stack ak4647 hifi interface */
	if (dev_data->src_port == 1)
		ssi_port = imx_ssi_1;
	else
		ssi_port = imx_ssi_3;
	hifi =
	    snd_soc_pcm_link_new(machine,
				 "imx_3stack-hifi", &hifi_pcm,
				 imx_pcm, ak4647_codec,
				 ak4647_hifi_dai, ssi_port);
	if (hifi == NULL) {
		pr_err("Failed to create HiFi PCM link\n");
		goto err;
	}
	ret = snd_soc_pcm_link_attach(hifi);
	hifi->private_data = dev_data;
	if (ret < 0)
		goto link_err;

	/* Configure audio port 3 */
	gpio_activate_audio_ports();

	if (request_irq
	    (dev_data->intr_id_hp, imx_headphone_detect_handler, 0,
	     "headphone", machine))
		goto link_err;

	ret = driver_create_file(pdev->dev.driver, &driver_attr_headphone);
	if (ret < 0)
		goto sysfs_err;

	return ret;

      sysfs_err:
	driver_remove_file(pdev->dev.driver, &driver_attr_headphone);
      link_err:
	snd_soc_machine_free(machine);
      err:
	kfree(machine);
	return ret;
}