diff options
Diffstat (limited to 'arch/arm/mach-s3c64xx/mach-crag6410-module.c')
| -rw-r--r-- | arch/arm/mach-s3c64xx/mach-crag6410-module.c | 141 | 
1 files changed, 116 insertions, 25 deletions
diff --git a/arch/arm/mach-s3c64xx/mach-crag6410-module.c b/arch/arm/mach-s3c64xx/mach-crag6410-module.c index 4e3fe57674c..c6d8dba9062 100644 --- a/arch/arm/mach-s3c64xx/mach-crag6410-module.c +++ b/arch/arm/mach-s3c64xx/mach-crag6410-module.c @@ -20,6 +20,8 @@  #include <linux/regulator/machine.h> +#include <sound/wm0010.h> +#include <sound/wm2200.h>  #include <sound/wm5100.h>  #include <sound/wm8996.h>  #include <sound/wm8962.h> @@ -33,14 +35,34 @@ static struct s3c64xx_spi_csinfo wm0010_spi_csinfo = {  	.line = S3C64XX_GPC(3),  }; +static struct wm0010_pdata wm0010_pdata = { +	.gpio_reset = S3C64XX_GPN(6), +	.reset_active_high = 1, /* Active high for Glenfarclas Rev 2 */ +}; +  static struct spi_board_info wm1253_devs[] = {  	[0] = {  		.modalias	= "wm0010", +		.max_speed_hz	= 26 * 1000 * 1000,  		.bus_num	= 0,  		.chip_select	= 0,  		.mode		= SPI_MODE_0,  		.irq		= S3C_EINT(5),  		.controller_data = &wm0010_spi_csinfo, +		.platform_data = &wm0010_pdata, +	}, +}; + +static struct spi_board_info balblair_devs[] = { +	[0] = { +		.modalias	= "wm0010", +		.max_speed_hz	= 26 * 1000 * 1000, +		.bus_num	= 0, +		.chip_select	= 0, +		.mode		= SPI_MODE_0, +		.irq		= S3C_EINT(4), +		.controller_data = &wm0010_spi_csinfo, +		.platform_data = &wm0010_pdata,  	},  }; @@ -166,12 +188,13 @@ static struct regulator_init_data wm8994_ldo2 = {  static struct wm8994_pdata wm8994_pdata = {  	.gpio_base = CODEC_GPIO_BASE, +	.micb2_delay = 150,  	.gpio_defaults = {  		0x3,          /* IRQ out, active high, CMOS */  	},  	.ldo = { -		 { .init_data = &wm8994_ldo1, }, -		 { .init_data = &wm8994_ldo2, }, +		 { .enable = S3C64XX_GPN(6), .init_data = &wm8994_ldo1, }, +		 { .enable = S3C64XX_GPN(4), .init_data = &wm8994_ldo2, },  	},  }; @@ -182,7 +205,7 @@ static const struct i2c_board_info wm1277_devs[] = {  	},  }; -static struct arizona_pdata wm5102_pdata = { +static struct arizona_pdata wm5102_reva_pdata = {  	.ldoena = S3C64XX_GPN(7),  	.gpio_base = CODEC_GPIO_BASE,  	.irq_active_high = true, @@ -193,64 +216,131 @@ static struct arizona_pdata wm5102_pdata = {  	},  }; -static struct s3c64xx_spi_csinfo wm5102_spi_csinfo = { +static struct s3c64xx_spi_csinfo codec_spi_csinfo = {  	.line = S3C64XX_GPN(5),  }; +static struct spi_board_info wm5102_reva_spi_devs[] = { +	[0] = { +		.modalias	= "wm5102", +		.max_speed_hz	= 10 * 1000 * 1000, +		.bus_num	= 0, +		.chip_select	= 1, +		.mode		= SPI_MODE_0, +		.irq		= GLENFARCLAS_PMIC_IRQ_BASE + +				  WM831X_IRQ_GPIO_2, +		.controller_data = &codec_spi_csinfo, +		.platform_data = &wm5102_reva_pdata, +	}, +}; + +static struct arizona_pdata wm5102_pdata = { +	.ldoena = S3C64XX_GPN(7), +	.gpio_base = CODEC_GPIO_BASE, +	.irq_active_high = true, +	.micd_pol_gpio = CODEC_GPIO_BASE + 2, +	.gpio_defaults = { +		[2] = 0x10000, /* AIF3TXLRCLK */ +		[3] = 0x4,     /* OPCLK */ +	}, +}; +  static struct spi_board_info wm5102_spi_devs[] = {  	[0] = {  		.modalias	= "wm5102",  		.max_speed_hz	= 10 * 1000 * 1000,  		.bus_num	= 0, -		.chip_select	= 0, +		.chip_select	= 1,  		.mode		= SPI_MODE_0,  		.irq		= GLENFARCLAS_PMIC_IRQ_BASE +  				  WM831X_IRQ_GPIO_2, -		.controller_data = &wm5102_spi_csinfo, +		.controller_data = &codec_spi_csinfo,  		.platform_data = &wm5102_pdata,  	},  }; +static struct spi_board_info wm5110_spi_devs[] = { +	[0] = { +		.modalias	= "wm5110", +		.max_speed_hz	= 10 * 1000 * 1000, +		.bus_num	= 0, +		.chip_select	= 1, +		.mode		= SPI_MODE_0, +		.irq		= GLENFARCLAS_PMIC_IRQ_BASE + +				  WM831X_IRQ_GPIO_2, +		.controller_data = &codec_spi_csinfo, +		.platform_data = &wm5102_reva_pdata, +	}, +}; +  static const struct i2c_board_info wm6230_i2c_devs[] = {  	{ I2C_BOARD_INFO("wm9081", 0x6c),  	  .platform_data = &wm9081_pdata, },  }; +static struct wm2200_pdata wm2200_pdata = { +	.ldo_ena = S3C64XX_GPN(7), +	.gpio_defaults = { +		[2] = 0x0005,  /* GPIO3 24.576MHz output clock */ +	}, +}; + +static const struct i2c_board_info wm2200_i2c[] = { +	{ I2C_BOARD_INFO("wm2200", 0x3a), +	  .platform_data = &wm2200_pdata, }, +}; +  static __devinitdata const struct {  	u8 id; +	u8 rev;  	const char *name;  	const struct i2c_board_info *i2c_devs;  	int num_i2c_devs;  	const struct spi_board_info *spi_devs;  	int num_spi_devs;  } gf_mods[] = { -	{ .id = 0x01, .name = "1250-EV1 Springbank" }, -	{ .id = 0x02, .name = "1251-EV1 Jura" }, -	{ .id = 0x03, .name = "1252-EV1 Glenlivet" }, -	{ .id = 0x11, .name = "6249-EV2 Glenfarclas", }, -	{ .id = 0x14, .name = "6271-EV1 Lochnagar" }, -	{ .id = 0x15, .name = "6320-EV1 Bells", +	{ .id = 0x01, .rev = 0xff, .name = "1250-EV1 Springbank" }, +	{ .id = 0x02, .rev = 0xff, .name = "1251-EV1 Jura" }, +	{ .id = 0x03, .rev = 0xff, .name = "1252-EV1 Glenlivet" }, +	{ .id = 0x06, .rev = 0xff, .name = "WM8997-6721-CS96-EV1 Lapraoig" }, +	{ .id = 0x07, .rev = 0xff, .name = "WM5110-6271 Deanston", +	  .spi_devs = wm5110_spi_devs, +	  .num_spi_devs = ARRAY_SIZE(wm5110_spi_devs) }, +	{ .id = 0x08, .rev = 0xff, .name = "WM8903-6102 Tamdhu" }, +	{ .id = 0x09, .rev = 0xff, .name = "WM1811A-6305 Adelphi" }, +	{ .id = 0x0a, .rev = 0xff, .name = "WM8996-6272 Blackadder" }, +	{ .id = 0x0b, .rev = 0xff, .name = "WM8994-6235 Benromach" }, +	{ .id = 0x11, .rev = 0xff, .name = "6249-EV2 Glenfarclas", }, +	{ .id = 0x14, .rev = 0xff, .name = "6271-EV1 Lochnagar" }, +	{ .id = 0x15, .rev = 0xff, .name = "6320-EV1 Bells",  	  .i2c_devs = wm6230_i2c_devs,  	  .num_i2c_devs = ARRAY_SIZE(wm6230_i2c_devs) }, -	{ .id = 0x21, .name = "1275-EV1 Mortlach" }, -	{ .id = 0x25, .name = "1274-EV1 Glencadam" }, -	{ .id = 0x31, .name = "1253-EV1 Tomatin", +	{ .id = 0x21, .rev = 0xff, .name = "1275-EV1 Mortlach" }, +	{ .id = 0x25, .rev = 0xff, .name = "1274-EV1 Glencadam" }, +	{ .id = 0x31, .rev = 0xff, .name = "1253-EV1 Tomatin",  	  .spi_devs = wm1253_devs, .num_spi_devs = ARRAY_SIZE(wm1253_devs) }, -	{ .id = 0x32, .name = "XXXX-EV1 Caol Illa" }, -	{ .id = 0x33, .name = "XXXX-EV1 Oban" }, -	{ .id = 0x34, .name = "WM0010-6320-CS42 Balblair" }, -	{ .id = 0x39, .name = "1254-EV1 Dallas Dhu", +	{ .id = 0x32, .rev = 0xff, .name = "XXXX-EV1 Caol Illa" }, +	{ .id = 0x33, .rev = 0xff, .name = "XXXX-EV1 Oban" }, +	{ .id = 0x34, .rev = 0xff, .name = "WM0010-6320-CS42 Balblair", +	  .spi_devs = balblair_devs, +	  .num_spi_devs = ARRAY_SIZE(balblair_devs) }, +	{ .id = 0x39, .rev = 0xff, .name = "1254-EV1 Dallas Dhu",  	  .i2c_devs = wm1254_devs, .num_i2c_devs = ARRAY_SIZE(wm1254_devs) }, -	{ .id = 0x3a, .name = "1259-EV1 Tobermory", +	{ .id = 0x3a, .rev = 0xff, .name = "1259-EV1 Tobermory",  	  .i2c_devs = wm1259_devs, .num_i2c_devs = ARRAY_SIZE(wm1259_devs) }, -	{ .id = 0x3b, .name = "1255-EV1 Kilchoman", +	{ .id = 0x3b, .rev = 0xff, .name = "1255-EV1 Kilchoman",  	  .i2c_devs = wm1255_devs, .num_i2c_devs = ARRAY_SIZE(wm1255_devs) }, -	{ .id = 0x3c, .name = "1273-EV1 Longmorn" }, -	{ .id = 0x3d, .name = "1277-EV1 Littlemill", +	{ .id = 0x3c, .rev = 0xff, .name = "1273-EV1 Longmorn" }, +	{ .id = 0x3d, .rev = 0xff, .name = "1277-EV1 Littlemill",  	  .i2c_devs = wm1277_devs, .num_i2c_devs = ARRAY_SIZE(wm1277_devs) }, -	{ .id = 0x3e, .name = "WM5102-6271-EV1-CS127 Amrut", +	{ .id = 0x3e, .rev = 0, .name = "WM5102-6271-EV1-CS127 Amrut", +	  .spi_devs = wm5102_reva_spi_devs, +	  .num_spi_devs = ARRAY_SIZE(wm5102_reva_spi_devs) }, +	{ .id = 0x3e, .rev = -1, .name = "WM5102-6271-EV1-CS127 Amrut",  	  .spi_devs = wm5102_spi_devs,  	  .num_spi_devs = ARRAY_SIZE(wm5102_spi_devs) }, +	{ .id = 0x3f, .rev = -1, .name = "WM2200-6271-CS90-M-REV1", +	  .i2c_devs = wm2200_i2c, .num_i2c_devs = ARRAY_SIZE(wm2200_i2c) },  };  static __devinit int wlf_gf_module_probe(struct i2c_client *i2c, @@ -267,7 +357,8 @@ static __devinit int wlf_gf_module_probe(struct i2c_client *i2c,  	id = (ret & 0xfe) >> 2;  	rev = ret & 0x3;  	for (i = 0; i < ARRAY_SIZE(gf_mods); i++) -		if (id == gf_mods[i].id) +		if (id == gf_mods[i].id && (gf_mods[i].rev == 0xff || +					    rev == gf_mods[i].rev))  			break;  	if (i < ARRAY_SIZE(gf_mods)) {  |