forked from Minki/linux
6ae52c65e0
In the SoC branch we normally collect classic arch/arm/mach-* contents, i.e. C code changes for SoC platforms. This release cycle the diffstat is quite nice, in that we're removing 3x the amount of code that's being added. The main reason for this is that there's a removal of camera drivers for Freescale i.MX chips (driver was removed so the device registration isn't needed any more). There's also removal of display initialization code for OMAP that is no longer needed. The rest are mostly minor tweaks and cleanups; constification on Samsung platforms, cleanup of ux500 platform data, purge of other unused platform data/device seutp on i.MX and other good stuff. New SoC support this cycle is for two Allwinner platforms, H2+ and V3s. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJYrMs4AAoJEIwa5zzehBx34LQP/j/pzJOw2cLr0iiHwNl/3jyC XFt/F6NFfPuBOCldUoMsZzD2lOR1Qbhp96fAQtDzs/HkGRVxokcHRVJC1QWozSkt 18wm8tc4HtLvjWoeXyh3zFvwl4wiqx4d4r4yxw1wZKA0uhEXrSNJu4P/RgtXH4SK TycfodE35kJ8wCxLNXYr1vaAMKgjmBkk8DAQa5t6XXBnSLGJmNAa5+vCJKab1im+ 9mOZ1EigtrkRR6eL6OJmru3MaZYLg7q+oxq5i/5NOIOZsCWq6Wk4r+5HnTg+8aVf QVs766sEjwZJ5ozZYhYucp8pvQhyatG36vwB51x1XlTA4XzAJwMEgPAtb5Pc/owU cst8d4m24Gc7oChcxlbmrqK64hpF1s5LK/ZbfdLPHaK1PS/ng/teHfVA2Q2HXwur HcHA8dDqgTVCNcCpLX1OgBUbq9S0aopuL9bdeg6q6fU8Skb49BmeHK2Iji3MZSkO 8XdY8H7oKtkwLFx18GJzmdXtH55vIXpHYMvgpjMaWAujtoqZCZ7+GHCmM3GyNCrF +KzJMVdx1lg6yYhfo4rZBWGzK2CrHvq5u5Vq7GExxhVCPsOx3mRQQ0JY/adGWU/y WTCbogwxUNbjlugffwQa+dYdF2KU2kAHAyEFDITndZmp60xJohWPYVJw+7imF5wR 0Qbcj6OvffBcaTdxKzTE =YE8v -----END PGP SIGNATURE----- Merge tag 'armsoc-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc Pull ARM SoC platform updates from Arnd Bergmann: "In the SoC branch we normally collect classic arch/arm/mach-* contents, i.e. C code changes for SoC platforms. This release cycle the diffstat is quite nice, in that we're removing 3x the amount of code that's being added. The main reason for this is that there's a removal of camera drivers for Freescale i.MX chips (driver was removed so the device registration isn't needed any more). There's also removal of display initialization code for OMAP that is no longer needed. The rest are mostly minor tweaks and cleanups; constification on Samsung platforms, cleanup of ux500 platform data, purge of other unused platform data/device seutp on i.MX and other good stuff. New SoC support this cycle is for two Allwinner platforms, H2+ and V3s" * tag 'armsoc-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (55 commits) ARM: ux500: remove deleted file from Makefile ARM: ep93xx: Disable TS-72xx watchdog before uncompressing ARM: ux500: cut some platform data MAINTAINERS: Update for the current location of the bcm2835 tree. ARM: davinci: remove BUG_ON() from da850_register_sata() ARM: davinci: da850: model the SATA refclk ARM: davinci: da850: add con_id for the SATA clock ARM: davinci: da8xx-dt: add OF_DEV_AUXDATA entry for SATA arm: mvebu: support for SMP on 98DX3336 SoC dt-bindings: video: exynos7-decon: Remove obsolete samsung,power-domain property soc: dove: constify reset_control_ops structures ARM: mv78xx0: fix possible PCI buffer overflow MAINTAINERS: transfer maintainership for the EZX platform ARM: shmobile: rcar-gen2: Add more register documentation ARM: tegra: paz00: Fix __initdata placement ARM: OMAP: clock: Remove unused mpurate cmdline option ARM: davinci: add skeleton for pdata-quirks arm: sunxi: add support for V3s SoC ARM: OMAP2+: omap_hwmod: Add support for earlycon arm: hisi: drop extern hip01_cpu_die ...
219 lines
5.0 KiB
C
219 lines
5.0 KiB
C
/* linux/arch/arm/plat-s3c/dev-audio.c
|
|
*
|
|
* Copyright 2009 Wolfson Microelectronics
|
|
* Mark Brown <broonie@opensource.wolfsonmicro.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/string.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/dma-mapping.h>
|
|
#include <linux/gpio.h>
|
|
#include <linux/export.h>
|
|
|
|
#include <mach/irqs.h>
|
|
#include <mach/map.h>
|
|
#include <mach/dma.h>
|
|
|
|
#include <plat/devs.h>
|
|
#include <linux/platform_data/asoc-s3c.h>
|
|
#include <plat/gpio-cfg.h>
|
|
#include <mach/gpio-samsung.h>
|
|
|
|
static int s3c64xx_i2s_cfg_gpio(struct platform_device *pdev)
|
|
{
|
|
unsigned int base;
|
|
|
|
switch (pdev->id) {
|
|
case 0:
|
|
base = S3C64XX_GPD(0);
|
|
break;
|
|
case 1:
|
|
base = S3C64XX_GPE(0);
|
|
break;
|
|
case 2:
|
|
s3c_gpio_cfgpin(S3C64XX_GPC(4), S3C_GPIO_SFN(5));
|
|
s3c_gpio_cfgpin(S3C64XX_GPC(5), S3C_GPIO_SFN(5));
|
|
s3c_gpio_cfgpin(S3C64XX_GPC(7), S3C_GPIO_SFN(5));
|
|
s3c_gpio_cfgpin_range(S3C64XX_GPH(6), 4, S3C_GPIO_SFN(5));
|
|
return 0;
|
|
default:
|
|
printk(KERN_DEBUG "Invalid I2S Controller number: %d\n",
|
|
pdev->id);
|
|
return -EINVAL;
|
|
}
|
|
|
|
s3c_gpio_cfgpin_range(base, 5, S3C_GPIO_SFN(3));
|
|
|
|
return 0;
|
|
}
|
|
|
|
static struct resource s3c64xx_iis0_resource[] = {
|
|
[0] = DEFINE_RES_MEM(S3C64XX_PA_IIS0, SZ_256),
|
|
};
|
|
|
|
static struct s3c_audio_pdata i2s0_pdata = {
|
|
.cfg_gpio = s3c64xx_i2s_cfg_gpio,
|
|
};
|
|
|
|
struct platform_device s3c64xx_device_iis0 = {
|
|
.name = "samsung-i2s",
|
|
.id = 0,
|
|
.num_resources = ARRAY_SIZE(s3c64xx_iis0_resource),
|
|
.resource = s3c64xx_iis0_resource,
|
|
.dev = {
|
|
.platform_data = &i2s0_pdata,
|
|
},
|
|
};
|
|
EXPORT_SYMBOL(s3c64xx_device_iis0);
|
|
|
|
static struct resource s3c64xx_iis1_resource[] = {
|
|
[0] = DEFINE_RES_MEM(S3C64XX_PA_IIS1, SZ_256),
|
|
};
|
|
|
|
static struct s3c_audio_pdata i2s1_pdata = {
|
|
.cfg_gpio = s3c64xx_i2s_cfg_gpio,
|
|
};
|
|
|
|
struct platform_device s3c64xx_device_iis1 = {
|
|
.name = "samsung-i2s",
|
|
.id = 1,
|
|
.num_resources = ARRAY_SIZE(s3c64xx_iis1_resource),
|
|
.resource = s3c64xx_iis1_resource,
|
|
.dev = {
|
|
.platform_data = &i2s1_pdata,
|
|
},
|
|
};
|
|
EXPORT_SYMBOL(s3c64xx_device_iis1);
|
|
|
|
static struct resource s3c64xx_iisv4_resource[] = {
|
|
[0] = DEFINE_RES_MEM(S3C64XX_PA_IISV4, SZ_256),
|
|
};
|
|
|
|
static struct s3c_audio_pdata i2sv4_pdata = {
|
|
.cfg_gpio = s3c64xx_i2s_cfg_gpio,
|
|
.type = {
|
|
.quirks = QUIRK_PRI_6CHAN,
|
|
},
|
|
};
|
|
|
|
struct platform_device s3c64xx_device_iisv4 = {
|
|
.name = "samsung-i2s",
|
|
.id = 2,
|
|
.num_resources = ARRAY_SIZE(s3c64xx_iisv4_resource),
|
|
.resource = s3c64xx_iisv4_resource,
|
|
.dev = {
|
|
.platform_data = &i2sv4_pdata,
|
|
},
|
|
};
|
|
EXPORT_SYMBOL(s3c64xx_device_iisv4);
|
|
|
|
|
|
/* PCM Controller platform_devices */
|
|
|
|
static int s3c64xx_pcm_cfg_gpio(struct platform_device *pdev)
|
|
{
|
|
unsigned int base;
|
|
|
|
switch (pdev->id) {
|
|
case 0:
|
|
base = S3C64XX_GPD(0);
|
|
break;
|
|
case 1:
|
|
base = S3C64XX_GPE(0);
|
|
break;
|
|
default:
|
|
printk(KERN_DEBUG "Invalid PCM Controller number: %d\n",
|
|
pdev->id);
|
|
return -EINVAL;
|
|
}
|
|
|
|
s3c_gpio_cfgpin_range(base, 5, S3C_GPIO_SFN(2));
|
|
return 0;
|
|
}
|
|
|
|
static struct resource s3c64xx_pcm0_resource[] = {
|
|
[0] = DEFINE_RES_MEM(S3C64XX_PA_PCM0, SZ_256),
|
|
};
|
|
|
|
static struct s3c_audio_pdata s3c_pcm0_pdata = {
|
|
.cfg_gpio = s3c64xx_pcm_cfg_gpio,
|
|
};
|
|
|
|
struct platform_device s3c64xx_device_pcm0 = {
|
|
.name = "samsung-pcm",
|
|
.id = 0,
|
|
.num_resources = ARRAY_SIZE(s3c64xx_pcm0_resource),
|
|
.resource = s3c64xx_pcm0_resource,
|
|
.dev = {
|
|
.platform_data = &s3c_pcm0_pdata,
|
|
},
|
|
};
|
|
EXPORT_SYMBOL(s3c64xx_device_pcm0);
|
|
|
|
static struct resource s3c64xx_pcm1_resource[] = {
|
|
[0] = DEFINE_RES_MEM(S3C64XX_PA_PCM1, SZ_256),
|
|
};
|
|
|
|
static struct s3c_audio_pdata s3c_pcm1_pdata = {
|
|
.cfg_gpio = s3c64xx_pcm_cfg_gpio,
|
|
};
|
|
|
|
struct platform_device s3c64xx_device_pcm1 = {
|
|
.name = "samsung-pcm",
|
|
.id = 1,
|
|
.num_resources = ARRAY_SIZE(s3c64xx_pcm1_resource),
|
|
.resource = s3c64xx_pcm1_resource,
|
|
.dev = {
|
|
.platform_data = &s3c_pcm1_pdata,
|
|
},
|
|
};
|
|
EXPORT_SYMBOL(s3c64xx_device_pcm1);
|
|
|
|
/* AC97 Controller platform devices */
|
|
|
|
static int s3c64xx_ac97_cfg_gpd(struct platform_device *pdev)
|
|
{
|
|
return s3c_gpio_cfgpin_range(S3C64XX_GPD(0), 5, S3C_GPIO_SFN(4));
|
|
}
|
|
|
|
static int s3c64xx_ac97_cfg_gpe(struct platform_device *pdev)
|
|
{
|
|
return s3c_gpio_cfgpin_range(S3C64XX_GPE(0), 5, S3C_GPIO_SFN(4));
|
|
}
|
|
|
|
static struct resource s3c64xx_ac97_resource[] = {
|
|
[0] = DEFINE_RES_MEM(S3C64XX_PA_AC97, SZ_256),
|
|
[1] = DEFINE_RES_IRQ(IRQ_AC97),
|
|
};
|
|
|
|
static struct s3c_audio_pdata s3c_ac97_pdata = {
|
|
};
|
|
|
|
static u64 s3c64xx_ac97_dmamask = DMA_BIT_MASK(32);
|
|
|
|
struct platform_device s3c64xx_device_ac97 = {
|
|
.name = "samsung-ac97",
|
|
.id = -1,
|
|
.num_resources = ARRAY_SIZE(s3c64xx_ac97_resource),
|
|
.resource = s3c64xx_ac97_resource,
|
|
.dev = {
|
|
.platform_data = &s3c_ac97_pdata,
|
|
.dma_mask = &s3c64xx_ac97_dmamask,
|
|
.coherent_dma_mask = DMA_BIT_MASK(32),
|
|
},
|
|
};
|
|
EXPORT_SYMBOL(s3c64xx_device_ac97);
|
|
|
|
void __init s3c64xx_ac97_setup_gpio(int num)
|
|
{
|
|
if (num == S3C64XX_AC97_GPD)
|
|
s3c_ac97_pdata.cfg_gpio = s3c64xx_ac97_cfg_gpd;
|
|
else
|
|
s3c_ac97_pdata.cfg_gpio = s3c64xx_ac97_cfg_gpe;
|
|
}
|