162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci//
362306a36Sopenharmony_ci// Copyright 2009 Wolfson Microelectronics
462306a36Sopenharmony_ci//      Mark Brown <broonie@opensource.wolfsonmicro.com>
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/kernel.h>
762306a36Sopenharmony_ci#include <linux/string.h>
862306a36Sopenharmony_ci#include <linux/platform_device.h>
962306a36Sopenharmony_ci#include <linux/dma-mapping.h>
1062306a36Sopenharmony_ci#include <linux/gpio.h>
1162306a36Sopenharmony_ci#include <linux/export.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include "irqs.h"
1462306a36Sopenharmony_ci#include "map.h"
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#include "devs.h"
1762306a36Sopenharmony_ci#include <linux/platform_data/asoc-s3c.h>
1862306a36Sopenharmony_ci#include "gpio-cfg.h"
1962306a36Sopenharmony_ci#include "gpio-samsung.h"
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cistatic int s3c64xx_i2s_cfg_gpio(struct platform_device *pdev)
2262306a36Sopenharmony_ci{
2362306a36Sopenharmony_ci	unsigned int base;
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	switch (pdev->id) {
2662306a36Sopenharmony_ci	case 0:
2762306a36Sopenharmony_ci		base = S3C64XX_GPD(0);
2862306a36Sopenharmony_ci		break;
2962306a36Sopenharmony_ci	case 1:
3062306a36Sopenharmony_ci		base = S3C64XX_GPE(0);
3162306a36Sopenharmony_ci		break;
3262306a36Sopenharmony_ci	case 2:
3362306a36Sopenharmony_ci		s3c_gpio_cfgpin(S3C64XX_GPC(4), S3C_GPIO_SFN(5));
3462306a36Sopenharmony_ci		s3c_gpio_cfgpin(S3C64XX_GPC(5), S3C_GPIO_SFN(5));
3562306a36Sopenharmony_ci		s3c_gpio_cfgpin(S3C64XX_GPC(7), S3C_GPIO_SFN(5));
3662306a36Sopenharmony_ci		s3c_gpio_cfgpin_range(S3C64XX_GPH(6), 4, S3C_GPIO_SFN(5));
3762306a36Sopenharmony_ci		return 0;
3862306a36Sopenharmony_ci	default:
3962306a36Sopenharmony_ci		printk(KERN_DEBUG "Invalid I2S Controller number: %d\n",
4062306a36Sopenharmony_ci			pdev->id);
4162306a36Sopenharmony_ci		return -EINVAL;
4262306a36Sopenharmony_ci	}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	s3c_gpio_cfgpin_range(base, 5, S3C_GPIO_SFN(3));
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	return 0;
4762306a36Sopenharmony_ci}
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cistatic struct resource s3c64xx_iis0_resource[] = {
5062306a36Sopenharmony_ci	[0] = DEFINE_RES_MEM(S3C64XX_PA_IIS0, SZ_256),
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistatic struct s3c_audio_pdata i2s0_pdata = {
5462306a36Sopenharmony_ci	.cfg_gpio = s3c64xx_i2s_cfg_gpio,
5562306a36Sopenharmony_ci};
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistruct platform_device s3c64xx_device_iis0 = {
5862306a36Sopenharmony_ci	.name		  = "samsung-i2s",
5962306a36Sopenharmony_ci	.id		  = 0,
6062306a36Sopenharmony_ci	.num_resources	  = ARRAY_SIZE(s3c64xx_iis0_resource),
6162306a36Sopenharmony_ci	.resource	  = s3c64xx_iis0_resource,
6262306a36Sopenharmony_ci	.dev = {
6362306a36Sopenharmony_ci		.platform_data = &i2s0_pdata,
6462306a36Sopenharmony_ci	},
6562306a36Sopenharmony_ci};
6662306a36Sopenharmony_ciEXPORT_SYMBOL(s3c64xx_device_iis0);
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_cistatic struct resource s3c64xx_iis1_resource[] = {
6962306a36Sopenharmony_ci	[0] = DEFINE_RES_MEM(S3C64XX_PA_IIS1, SZ_256),
7062306a36Sopenharmony_ci};
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistatic struct s3c_audio_pdata i2s1_pdata = {
7362306a36Sopenharmony_ci	.cfg_gpio = s3c64xx_i2s_cfg_gpio,
7462306a36Sopenharmony_ci};
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cistruct platform_device s3c64xx_device_iis1 = {
7762306a36Sopenharmony_ci	.name		  = "samsung-i2s",
7862306a36Sopenharmony_ci	.id		  = 1,
7962306a36Sopenharmony_ci	.num_resources	  = ARRAY_SIZE(s3c64xx_iis1_resource),
8062306a36Sopenharmony_ci	.resource	  = s3c64xx_iis1_resource,
8162306a36Sopenharmony_ci	.dev = {
8262306a36Sopenharmony_ci		.platform_data = &i2s1_pdata,
8362306a36Sopenharmony_ci	},
8462306a36Sopenharmony_ci};
8562306a36Sopenharmony_ciEXPORT_SYMBOL(s3c64xx_device_iis1);
86