162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Efika driver for the PSC of the Freescale MPC52xx 362306a36Sopenharmony_ci * configured as AC97 interface 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright 2008 Jon Smirl, Digispeaker 662306a36Sopenharmony_ci * Author: Jon Smirl <jonsmirl@gmail.com> 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * This file is licensed under the terms of the GNU General Public License 962306a36Sopenharmony_ci * version 2. This program is licensed "as is" without any warranty of any 1062306a36Sopenharmony_ci * kind, whether express or implied. 1162306a36Sopenharmony_ci */ 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/init.h> 1462306a36Sopenharmony_ci#include <linux/module.h> 1562306a36Sopenharmony_ci#include <linux/interrupt.h> 1662306a36Sopenharmony_ci#include <linux/device.h> 1762306a36Sopenharmony_ci#include <linux/delay.h> 1862306a36Sopenharmony_ci#include <linux/of_device.h> 1962306a36Sopenharmony_ci#include <linux/of_platform.h> 2062306a36Sopenharmony_ci#include <linux/dma-mapping.h> 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#include <sound/core.h> 2362306a36Sopenharmony_ci#include <sound/pcm.h> 2462306a36Sopenharmony_ci#include <sound/pcm_params.h> 2562306a36Sopenharmony_ci#include <sound/initval.h> 2662306a36Sopenharmony_ci#include <sound/soc.h> 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#include "mpc5200_dma.h" 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#define DRV_NAME "efika-audio-fabric" 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(analog, 3362306a36Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CPU("mpc5200-psc-ac97.0")), 3462306a36Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CODEC("stac9766-codec", 3562306a36Sopenharmony_ci "stac9766-hifi-analog")), 3662306a36Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_PLATFORM("mpc5200-pcm-audio"))); 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(iec958, 3962306a36Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CPU("mpc5200-psc-ac97.1")), 4062306a36Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CODEC("stac9766-codec", 4162306a36Sopenharmony_ci "stac9766-hifi-IEC958")), 4262306a36Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_PLATFORM("mpc5200-pcm-audio"))); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cistatic struct snd_soc_dai_link efika_fabric_dai[] = { 4562306a36Sopenharmony_ci{ 4662306a36Sopenharmony_ci .name = "AC97", 4762306a36Sopenharmony_ci .stream_name = "AC97 Analog", 4862306a36Sopenharmony_ci SND_SOC_DAILINK_REG(analog), 4962306a36Sopenharmony_ci}, 5062306a36Sopenharmony_ci{ 5162306a36Sopenharmony_ci .name = "AC97", 5262306a36Sopenharmony_ci .stream_name = "AC97 IEC958", 5362306a36Sopenharmony_ci SND_SOC_DAILINK_REG(iec958), 5462306a36Sopenharmony_ci}, 5562306a36Sopenharmony_ci}; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistatic struct snd_soc_card card = { 5862306a36Sopenharmony_ci .name = "Efika", 5962306a36Sopenharmony_ci .owner = THIS_MODULE, 6062306a36Sopenharmony_ci .dai_link = efika_fabric_dai, 6162306a36Sopenharmony_ci .num_links = ARRAY_SIZE(efika_fabric_dai), 6262306a36Sopenharmony_ci}; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistatic __init int efika_fabric_init(void) 6562306a36Sopenharmony_ci{ 6662306a36Sopenharmony_ci struct platform_device *pdev; 6762306a36Sopenharmony_ci int rc; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci if (!of_machine_is_compatible("bplan,efika")) 7062306a36Sopenharmony_ci return -ENODEV; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci pdev = platform_device_alloc("soc-audio", 1); 7362306a36Sopenharmony_ci if (!pdev) { 7462306a36Sopenharmony_ci pr_err("efika_fabric_init: platform_device_alloc() failed\n"); 7562306a36Sopenharmony_ci return -ENODEV; 7662306a36Sopenharmony_ci } 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci platform_set_drvdata(pdev, &card); 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci rc = platform_device_add(pdev); 8162306a36Sopenharmony_ci if (rc) { 8262306a36Sopenharmony_ci pr_err("efika_fabric_init: platform_device_add() failed\n"); 8362306a36Sopenharmony_ci platform_device_put(pdev); 8462306a36Sopenharmony_ci return -ENODEV; 8562306a36Sopenharmony_ci } 8662306a36Sopenharmony_ci return 0; 8762306a36Sopenharmony_ci} 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_cimodule_init(efika_fabric_init); 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ciMODULE_AUTHOR("Jon Smirl <jonsmirl@gmail.com>"); 9362306a36Sopenharmony_ciMODULE_DESCRIPTION(DRV_NAME ": mpc5200 Efika fabric driver"); 9462306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 9562306a36Sopenharmony_ci 96