ARM: mach-shmobile: mackerel: Add FSI-AK4643 support
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Wed, 1 Dec 2010 00:31:46 +0000 (00:31 +0000)
committerPaul Mundt <lethal@linux-sh.org>
Wed, 1 Dec 2010 06:55:04 +0000 (15:55 +0900)
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/arm/mach-shmobile/board-mackerel.c

index b9528b0211dca3282c5fd8d42ed4c12def6b2447..cf3e660d8e70a017836a38a11be00b1392407b1b 100644 (file)
 #include <linux/gpio.h>
 #include <linux/input.h>
 #include <linux/io.h>
+#include <linux/i2c.h>
 #include <linux/leds.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/physmap.h>
 #include <linux/smsc911x.h>
+#include <linux/sh_intc.h>
 #include <linux/usb/r8a66597.h>
 
 #include <video/sh_mobile_lcdc.h>
 
+#include <sound/sh_fsi.h>
+
 #include <mach/common.h>
 #include <mach/sh7372.h>
 
  * CN31 is used as Host in Linux.
  */
 
+/*
+ * FIXME !!
+ *
+ * gpio_no_direction
+ * are quick_hack.
+ *
+ * current gpio frame work doesn't have
+ * the method to control only pull up/down/free.
+ * this function should be replaced by correct gpio function
+ */
+static void __init gpio_no_direction(u32 addr)
+{
+       __raw_writeb(0x00, addr);
+}
+
 /* MTD */
 static struct mtd_partition nor_flash_partitions[] = {
        {
@@ -347,6 +366,42 @@ static struct platform_device leds_device = {
        },
 };
 
+/* FSI */
+#define IRQ_FSI evt2irq(0x1840)
+static struct sh_fsi_platform_info fsi_info = {
+       .porta_flags =  SH_FSI_BRS_INV          |
+                       SH_FSI_OUT_SLAVE_MODE   |
+                       SH_FSI_IN_SLAVE_MODE    |
+                       SH_FSI_OFMT(PCM)        |
+                       SH_FSI_IFMT(PCM),
+};
+
+static struct resource fsi_resources[] = {
+       [0] = {
+               .name   = "FSI",
+               .start  = 0xFE3C0000,
+               .end    = 0xFE3C0400 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = IRQ_FSI,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device fsi_device = {
+       .name           = "sh_fsi2",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(fsi_resources),
+       .resource       = fsi_resources,
+       .dev    = {
+               .platform_data  = &fsi_info,
+       },
+};
+
+static struct platform_device fsi_ak4643_device = {
+       .name           = "sh_fsi2_a_ak4643",
+};
 
 static struct platform_device *mackerel_devices[] __initdata = {
        &nor_flash_device,
@@ -354,6 +409,15 @@ static struct platform_device *mackerel_devices[] __initdata = {
        &lcdc_device,
        &usb1_host_device,
        &leds_device,
+       &fsi_device,
+       &fsi_ak4643_device,
+};
+
+/* I2C */
+static struct i2c_board_info i2c0_devices[] = {
+       {
+               I2C_BOARD_INFO("ak4643", 0x13),
+       },
 };
 
 static struct map_desc mackerel_io_desc[] __initdata = {
@@ -377,6 +441,8 @@ static void __init mackerel_map_io(void)
        shmobile_setup_console();
 }
 
+#define GPIO_PORT9CR   0xE6051009
+#define GPIO_PORT10CR  0xE605100A
 static void __init mackerel_init(void)
 {
        sh7372_pinmux_init();
@@ -434,6 +500,24 @@ static void __init mackerel_init(void)
        /* setup USB phy */
        __raw_writew(0x8a0a, 0xE6058130);       /* USBCR2 */
 
+       /* enable FSI2 port A (ak4643) */
+       gpio_request(GPIO_FN_FSIAIBT,   NULL);
+       gpio_request(GPIO_FN_FSIAILR,   NULL);
+       gpio_request(GPIO_FN_FSIAISLD,  NULL);
+       gpio_request(GPIO_FN_FSIAOSLD,  NULL);
+       gpio_request(GPIO_PORT161,      NULL);
+       gpio_direction_output(GPIO_PORT161, 0); /* slave */
+
+       gpio_request(GPIO_PORT9,  NULL);
+       gpio_request(GPIO_PORT10, NULL);
+       gpio_no_direction(GPIO_PORT9CR);  /* FSIAOBT needs no direction */
+       gpio_no_direction(GPIO_PORT10CR); /* FSIAOLR needs no direction */
+
+       intc_set_priority(IRQ_FSI, 3); /* irq priority FSI(3) > SMSC911X(2) */
+
+
+       i2c_register_board_info(0, i2c0_devices,
+                               ARRAY_SIZE(i2c0_devices));
 
        sh7372_add_standard_devices();