diff options
author | Michael Lauer <mickey@vanille-media.de> | 2008-09-24 07:54:26 +0000 |
---|---|---|
committer | Michael Lauer <mickey@vanille-media.de> | 2008-09-24 07:54:26 +0000 |
commit | 6a29c84f3665f335577c12198590021cb4abc78e (patch) | |
tree | a97cd126dd779599e5667f44f02d2ab7ffec9119 /packages/linux | |
parent | 0e8eedf8e6324d9b283a2b6299932d9db18e56ca (diff) |
linux-openmoko 2.6.24 update and remove outdated patches
Diffstat (limited to 'packages/linux')
13 files changed, 5 insertions, 1448 deletions
diff --git a/packages/linux/linux-ezx_2.6.21.bb b/packages/linux/linux-ezx_2.6.21.bb index 7ba2556bb8..150a4a153c 100644 --- a/packages/linux/linux-ezx_2.6.21.bb +++ b/packages/linux/linux-ezx_2.6.21.bb @@ -8,6 +8,8 @@ require linux.inc RPSRC = "http://www.rpsys.net/openzaurus/patches/archive" +CFLAGS += "-DPATH_MAX=256" + SRC_URI = " \ ${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-${PV}.tar.bz2 \ file://logo_linux_clut224.ppm \ diff --git a/packages/linux/linux-openezx-devel_svn.bb b/packages/linux/linux-openezx-devel_svn.bb index 6c0af7cfb6..17156535ea 100644 --- a/packages/linux/linux-openezx-devel_svn.bb +++ b/packages/linux/linux-openezx-devel_svn.bb @@ -55,6 +55,7 @@ CMDLINE = "${CMDLINE_CON} ${CMDLINE_ROOT} ${CMDLINE_IP} ${CMDLINE_ROTATE} ${CMDL do_prepatch() { mv ${WORKDIR}/${KERNEL_PATCHES}/defconfig-${MACHINE} ${WORKDIR}/defconfig +# mv ${WORKDIR}/defconfig-${MACHINE} ${WORKDIR}/defconfig mv ${WORKDIR}/${KERNEL_PATCHES} ${S}/patches && cd ${S} && quilt push -av mv patches patches.openezx mv .pc .pc.old diff --git a/packages/linux/linux-openmoko/fix-EVIOCGRAB-semantics-2.6.22.5.patch b/packages/linux/linux-openmoko/fix-EVIOCGRAB-semantics-2.6.22.5.patch deleted file mode 100644 index cc74c0e289..0000000000 --- a/packages/linux/linux-openmoko/fix-EVIOCGRAB-semantics-2.6.22.5.patch +++ /dev/null @@ -1,91 +0,0 @@ -Index: linux-2.6.22.5/drivers/input/evdev.c -=================================================================== ---- linux-2.6.22.5.orig/drivers/input/evdev.c -+++ linux-2.6.22.5/drivers/input/evdev.c -@@ -28,7 +28,7 @@ struct evdev { - char name[16]; - struct input_handle handle; - wait_queue_head_t wait; -- struct evdev_client *grab; -+ int grab; - struct list_head client_list; - }; - -@@ -36,6 +36,7 @@ struct evdev_client { - struct input_event buffer[EVDEV_BUFFER_SIZE]; - int head; - int tail; -+ int grab; - struct fasync_struct *fasync; - struct evdev *evdev; - struct list_head node; -@@ -48,8 +49,7 @@ static void evdev_event(struct input_han - struct evdev *evdev = handle->private; - struct evdev_client *client; - -- if (evdev->grab) { -- client = evdev->grab; -+ list_for_each_entry(client, &evdev->client_list, node) { - - do_gettimeofday(&client->buffer[client->head].time); - client->buffer[client->head].type = type; -@@ -58,17 +58,7 @@ static void evdev_event(struct input_han - client->head = (client->head + 1) & (EVDEV_BUFFER_SIZE - 1); - - kill_fasync(&client->fasync, SIGIO, POLL_IN); -- } else -- list_for_each_entry(client, &evdev->client_list, node) { -- -- do_gettimeofday(&client->buffer[client->head].time); -- client->buffer[client->head].type = type; -- client->buffer[client->head].code = code; -- client->buffer[client->head].value = value; -- client->head = (client->head + 1) & (EVDEV_BUFFER_SIZE - 1); -- -- kill_fasync(&client->fasync, SIGIO, POLL_IN); -- } -+ } - - wake_up_interruptible(&evdev->wait); - } -@@ -105,9 +95,10 @@ static int evdev_release(struct inode *i - struct evdev_client *client = file->private_data; - struct evdev *evdev = client->evdev; - -- if (evdev->grab == client) { -- input_release_device(&evdev->handle); -- evdev->grab = NULL; -+ if (client->grab) { -+ if(!--evdev->grab && evdev->exist) -+ input_release_device(&evdev->handle); -+ client->grab = 0; - } - - evdev_fasync(-1, file, 0); -@@ -488,17 +479,19 @@ static long evdev_ioctl_handler(struct f - - case EVIOCGRAB: - if (p) { -- if (evdev->grab) -- return -EBUSY; -- if (input_grab_device(&evdev->handle)) -+ if (client->grab) - return -EBUSY; -- evdev->grab = client; -+ if (!evdev->grab++) -+ if (input_grab_device(&evdev->handle)) -+ return -EBUSY; -+ client->grab = 0; - return 0; - } else { -- if (evdev->grab != client) -+ if (!client->grab) - return -EINVAL; -- input_release_device(&evdev->handle); -- evdev->grab = NULL; -+ if (!--evdev->grab) -+ input_release_device(&evdev->handle); -+ client->grab = 0; - return 0; - } - diff --git a/packages/linux/linux-openmoko/fix-EVIOCGRAB-semantics.patch b/packages/linux/linux-openmoko/fix-EVIOCGRAB-semantics.patch deleted file mode 100644 index 3c96faa271..0000000000 --- a/packages/linux/linux-openmoko/fix-EVIOCGRAB-semantics.patch +++ /dev/null @@ -1,97 +0,0 @@ -diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c -index 12c7ab8..c7e741b 100644 ---- a/drivers/input/evdev.c -+++ b/drivers/input/evdev.c -@@ -29,7 +29,7 @@ struct evdev { - char name[16]; - struct input_handle handle; - wait_queue_head_t wait; -- struct evdev_list *grab; -+ int grab; - struct list_head list; - }; - -@@ -37,6 +37,7 @@ struct evdev_list { - struct input_event buffer[EVDEV_BUFFER_SIZE]; - int head; - int tail; -+ int grab; - struct fasync_struct *fasync; - struct evdev *evdev; - struct list_head node; -@@ -49,8 +50,7 @@ static void evdev_event(struct input_han - struct evdev *evdev = handle->private; - struct evdev_list *list; - -- if (evdev->grab) { -- list = evdev->grab; -+ list_for_each_entry(list, &evdev->list, node) { - - do_gettimeofday(&list->buffer[list->head].time); - list->buffer[list->head].type = type; -@@ -59,17 +59,7 @@ static void evdev_event(struct input_han - list->head = (list->head + 1) & (EVDEV_BUFFER_SIZE - 1); - - kill_fasync(&list->fasync, SIGIO, POLL_IN); -- } else -- list_for_each_entry(list, &evdev->list, node) { -- -- do_gettimeofday(&list->buffer[list->head].time); -- list->buffer[list->head].type = type; -- list->buffer[list->head].code = code; -- list->buffer[list->head].value = value; -- list->head = (list->head + 1) & (EVDEV_BUFFER_SIZE - 1); -- -- kill_fasync(&list->fasync, SIGIO, POLL_IN); -- } -+ } - - wake_up_interruptible(&evdev->wait); - } -@@ -104,9 +94,10 @@ static int evdev_release(struct inode * - { - struct evdev_list *list = file->private_data; - -- if (list->evdev->grab == list) { -- input_release_device(&list->evdev->handle); -- list->evdev->grab = NULL; -+ if (list->grab) { -+ if(!--list->evdev->grab && list->evdev->exist) -+ input_release_device(&list->evdev->handle); -+ list->grab = 0; - } - - evdev_fasync(-1, file, 0); -@@ -483,17 +474,19 @@ static long evdev_ioctl_handler(struct f - - case EVIOCGRAB: - if (p) { -- if (evdev->grab) -- return -EBUSY; -- if (input_grab_device(&evdev->handle)) -+ if (list->grab) - return -EBUSY; -- evdev->grab = list; -+ if (!evdev->grab++) -+ if (input_grab_device(&evdev->handle)) -+ return -EBUSY; -+ list->grab = 0; - return 0; - } else { -- if (evdev->grab != list) -+ if (!list->grab) - return -EINVAL; -- input_release_device(&evdev->handle); -- evdev->grab = NULL; -+ if (!--evdev->grab) -+ input_release_device(&evdev->handle); -+ list->grab = 0; - return 0; - } - -- -To unsubscribe from this list: send the line "unsubscribe linux-kernel" in -the body of a message to majordomo@vger.kernel.org -More majordomo info at http://vger.kernel.org/majordomo-info.html -Please read the FAQ at http://www.tux.org/lkml/ - diff --git a/packages/linux/linux-openmoko/fix-gta01-flowcontrol2-2.6.22.5.patch b/packages/linux/linux-openmoko/fix-gta01-flowcontrol2-2.6.22.5.patch deleted file mode 100644 index ddb58f0cdb..0000000000 --- a/packages/linux/linux-openmoko/fix-gta01-flowcontrol2-2.6.22.5.patch +++ /dev/null @@ -1,193 +0,0 @@ ---- linux-2.6.22.5/arch/arm/common/gta01_pm_gsm.c.orig 2007-09-27 11:23:20.000000000 -0500 -+++ linux-2.6.22.5/arch/arm/common/gta01_pm_gsm.c 2007-09-27 21:09:00.000000000 -0500 -@@ -23,6 +23,9 @@ - #include <asm/arch/gta01.h> - #include <asm/arch/gta02.h> - -+#include <linux/serial_core.h> -+void s3c24xx_set_flow_control(struct uart_port *port, int fc_on); -+ - struct gta01pm_priv { - int gpio_ngsm_en; - struct console *con; -@@ -49,6 +52,23 @@ - static ssize_t gsm_read(struct device *dev, struct device_attribute *attr, - char *buf) - { -+ struct uart_driver *udrive = NULL; -+ struct uart_state *ustate = NULL; -+ struct uart_port *uport = NULL; -+ -+ if (gta01_gsm.con) { -+ udrive = gta01_gsm.con->data; -+ if (udrive) { -+ ustate = udrive->state; -+ if (ustate) { -+ uport = ustate->port; -+ } -+ } -+ } -+ printk("gsm: gsm_read of \"%s\"\n", attr->attr.name); -+ printk("gsm: con=%p udrive=%p ustate=%p uport=%p\n", -+ gta01_gsm.con, udrive, ustate, uport); -+ - if (!strcmp(attr->attr.name, "power_on")) { - if (s3c2410_gpio_getpin(GTA01_GPIO_MODEM_ON)) - goto out_1; -@@ -58,6 +78,24 @@ - } else if (!strcmp(attr->attr.name, "download")) { - if (s3c2410_gpio_getpin(GTA01_GPIO_MODEM_DNLOAD)) - goto out_1; -+ } else if (!strcmp(attr->attr.name, "flowcontrol")) { -+ if (uport) { -+ if (uport->unused[2] & 0x2) { -+ if (uport->unused[2] & 0x1) { -+ printk("gsm: flow control allowed and on\n"); -+ goto out_1; -+ } else { -+ printk("gsm: flow control allowed and not on\n"); -+ } -+ } else { -+ if (uport->unused[2] & 0x1) -+ printk("gsm: flow control not allowed, " -+ "but is pending\n"); -+ else -+ printk("gsm: flow control not allowed, " -+ "not pending\n"); -+ } -+ } - } - - return strlcpy(buf, "0\n", 3); -@@ -68,10 +106,26 @@ - static ssize_t gsm_write(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) - { -+ struct uart_driver *udrive = NULL; -+ struct uart_state *ustate = NULL; -+ struct uart_port *uport = NULL; -+ static int was_on = 0; - unsigned long on = simple_strtoul(buf, NULL, 10); - -+ if (gta01_gsm.con) { -+ udrive = gta01_gsm.con->data; -+ if (udrive) { -+ ustate = udrive->state; -+ if (ustate) { -+ uport = ustate->port; -+ } -+ } -+ } -+ printk("gsm: con=%p udrive=%p ustate=%p uport=%p\n", -+ gta01_gsm.con, udrive, ustate, uport); -+ - if (!strcmp(attr->attr.name, "power_on")) { -- if (on) { -+ if (on && !was_on) { - if (gta01_gsm.con) { - dev_info(dev, "powering up GSM, thus " - "disconnecting serial console\n"); -@@ -83,7 +137,24 @@ - s3c2410_gpio_setpin(gta01_gsm.gpio_ngsm_en, 0); - - s3c2410_gpio_setpin(GTA01_GPIO_MODEM_ON, 1); -- } else { -+ -+ if (uport) { -+ /* set any pending flow-control mode */ -+ uport->unused[2] |= 0x2; -+ s3c24xx_set_flow_control(uport, -+ (uport->unused[2] & 0x1)); -+ dev_info(dev, "flow control allowed\n"); -+ } -+ -+ was_on = 1; -+ -+ } else if (!on && was_on) { -+ if (uport) { -+ uport->unused[2] &= ~0x2; -+ s3c24xx_set_flow_control(uport, 0); -+ dev_info(dev, "flow control not allowed\n"); -+ } -+ - s3c2410_gpio_setpin(GTA01_GPIO_MODEM_ON, 0); - - if (gta01_gsm.gpio_ngsm_en) -@@ -95,6 +166,8 @@ - dev_info(dev, "powered down GSM, thus enabling " - "serial console\n"); - } -+ -+ was_on = 0; - } - } else if (!strcmp(attr->attr.name, "reset")) { - s3c2410_gpio_setpin(GTA01_GPIO_MODEM_RST, on); -@@ -105,6 +178,7 @@ - return count; - } - -+static DEVICE_ATTR(flowcontrol, 0644, gsm_read, gsm_write); - static DEVICE_ATTR(power_on, 0644, gsm_read, gsm_write); - static DEVICE_ATTR(reset, 0644, gsm_read, gsm_write); - static DEVICE_ATTR(download, 0644, gsm_read, gsm_write); -@@ -136,6 +210,7 @@ - #endif - - static struct attribute *gta01_gsm_sysfs_entries[] = { -+ &dev_attr_flowcontrol.attr, - &dev_attr_power_on.attr, - &dev_attr_reset.attr, - NULL, ---- linux-2.6.22.5/drivers/serial/s3c2410.c.orig 2007-09-27 11:23:27.000000000 -0500 -+++ linux-2.6.22.5/drivers/serial/s3c2410.c 2007-09-27 21:07:21.000000000 -0500 -@@ -80,6 +80,8 @@ - - #include <asm/arch/regs-serial.h> - #include <asm/arch/regs-gpio.h> -+#include <asm/mach-types.h> -+#include <asm/arch/gta01.h> - - /* structures */ - -@@ -729,6 +731,17 @@ - return best->quot; - } - -+/* This routine is called whenever the gta01 modem/console switches */ -+void s3c24xx_set_flow_control(struct uart_port *port, int fc_on) -+{ -+ unsigned int umcon; -+ if (machine_is_neo1973_gta01() && port) { -+ umcon = (fc_on) ? S3C2410_UMCOM_AFC : 0; -+ wr_regl(port, S3C2410_UMCON, umcon); -+ } -+} -+EXPORT_SYMBOL(s3c24xx_set_flow_control); -+ - static void s3c24xx_serial_set_termios(struct uart_port *port, - struct ktermios *termios, - struct ktermios *old) -@@ -803,6 +816,23 @@ - - umcon = (termios->c_cflag & CRTSCTS) ? S3C2410_UMCOM_AFC : 0; - -+ /* -+ * Custom handling of flow control on hwport 0 for the GTA01: -+ * Save the desired state for flow control, but if the port -+ * is being used as a console, then do not actually enable -+ * flow control unless the flag permiting us to do so is set. -+ */ -+ if (machine_is_neo1973_gta01() && (cfg->hwport == 0)) { -+ if (umcon) -+ port->unused[2] |= 0x1; -+ else -+ port->unused[2] &= ~0x1; -+ if (port->cons && (port->cons->index >= 0)) { -+ if (!(port->unused[2] & 0x2)) -+ umcon = 0; -+ } -+ } -+ - if (termios->c_cflag & PARENB) { - if (termios->c_cflag & PARODD) - ulcon |= S3C2410_LCON_PODD; diff --git a/packages/linux/linux-openmoko/glamo-report-vram-size-to-userspace.patch b/packages/linux/linux-openmoko/glamo-report-vram-size-to-userspace.patch deleted file mode 100644 index 563923e71c..0000000000 --- a/packages/linux/linux-openmoko/glamo-report-vram-size-to-userspace.patch +++ /dev/null @@ -1,67 +0,0 @@ -From ff1564e5100eeccd53ee6b007813ea722f8cf8b6 Mon Sep 17 00:00:00 2001 -From: Chia-I Wu <olv@openmoko.com> -Date: Mon, 1 Oct 2007 21:16:46 +0800 -Subject: [PATCH] glamo: report vram size to userspace - -Set fb_fix_screeninfo.smem_len to RESSIZE(fb_res). This is not the real -vram size, as it is a hardcoded value in glamo-core.c for now. ---- - drivers/video/glamo/glamo-fb.c | 13 +++++-------- - 1 files changed, 5 insertions(+), 8 deletions(-) - -diff --git a/drivers/video/glamo/glamo-fb.c b/drivers/video/glamo/glamo-fb.c -index 451de75..160a5b1 100644 ---- a/drivers/video/glamo/glamo-fb.c -+++ b/drivers/video/glamo/glamo-fb.c -@@ -54,8 +54,6 @@ - - #define RESSIZE(ressource) (((ressource)->end - (ressource)->start)+1) - --#define GLAMO_FB_ALLOC (640*480*2) -- - struct glamofb_handle { - struct fb_info *fb; - struct device *dev; -@@ -224,7 +222,6 @@ static int glamofb_set_par(struct fb_info *info) - } - - glamo->fb->fix.line_length = (var->width * var->bits_per_pixel) / 8; -- glamo->fb->fix.smem_len = info->fix.line_length * var->yres_virtual; - - return 0; - } -@@ -453,7 +450,7 @@ static int __init glamofb_probe(struct platform_device *pdev) - } - - glamofb->fb_res = request_mem_region(glamofb->fb_res->start, -- GLAMO_FB_ALLOC, pdev->name); -+ RESSIZE(glamofb->fb_res), pdev->name); - if (!glamofb->fb_res) { - dev_err(&pdev->dev, "failed to request vram region\n"); - goto out_release_reg; -@@ -467,6 +464,7 @@ static int __init glamofb_probe(struct platform_device *pdev) - goto out_release_fb; - } - fbinfo->fix.smem_start = (unsigned long) glamofb->fb_res->start; -+ fbinfo->fix.smem_len = RESSIZE(glamofb->fb_res); - - fbinfo->screen_base = ioremap(glamofb->fb_res->start, - RESSIZE(glamofb->fb_res)); -@@ -522,11 +520,10 @@ static int __init glamofb_probe(struct platform_device *pdev) - fbinfo->var.green.length = 6; - fbinfo->var.blue.length = 5; - fbinfo->var.transp.length = 0; -- fbinfo->fix.smem_len = mach_info->xres.max * -- mach_info->yres.max * -- mach_info->bpp.max / 8; - -- memset(fbinfo->screen_base, 0, fbinfo->fix.smem_len); -+ memset(fbinfo->screen_base, 0, mach_info->xres.max * -+ mach_info->yres.max * -+ mach_info->bpp.max / 8); - - glamo_engine_enable(mach_info->glamo, GLAMO_ENGINE_LCD); - glamo_engine_reset(mach_info->glamo, GLAMO_ENGINE_LCD); --- -1.5.3.1 - diff --git a/packages/linux/linux-openmoko/glamo-turbo-mode.patch b/packages/linux/linux-openmoko/glamo-turbo-mode.patch deleted file mode 100644 index 4f03c967ec..0000000000 --- a/packages/linux/linux-openmoko/glamo-turbo-mode.patch +++ /dev/null @@ -1,32 +0,0 @@ -X-Git-Url: http://git.openmoko.org/?p=kernel.git;a=blobdiff_plain;f=drivers%2Fmfd%2Fglamo%2Fglamo-core.c;fp=drivers%2Fmfd%2Fglamo%2Fglamo-core.c;h=bc91178ba609fbb99343eca212e7dda85e110d7c;hp=2619c5fc9fc3a189232504b97d3f024249bd9a72;hb=b920e3309db7e4f733499dc724a0dfba310edc5c;hpb=c1768ad6cc5b11eeda4394f68fbaedd03eea3354 - -diff --git a/drivers/mfd/glamo/glamo-core.c b/drivers/mfd/glamo/glamo-core.c -index 2619c5f..bc91178 100644 ---- a/drivers/mfd/glamo/glamo-core.c -+++ b/drivers/mfd/glamo/glamo-core.c -@@ -740,7 +740,11 @@ static struct glamo_script glamo_init_script[] = { - { GLAMO_REG_CLOCK_GEN7, 0x0101 }, - { GLAMO_REG_CLOCK_GEN8, 0x0100 }, - { GLAMO_REG_CLOCK_HOST, 0x000d }, -- { 0x200, 0x0ef0 }, -+ /* -+ * b7..b4 = 0 = no wait states on read or write -+ * b0 = 1 select PLL2 for Host interface, b1 = enable it -+ */ -+ { 0x200, 0x0e03 }, - { 0x202, 0x07ff }, - { 0x212, 0x0000 }, - { 0x214, 0x4000 }, -@@ -750,11 +754,7 @@ static struct glamo_script glamo_init_script[] = { - * more efficiency when 640x480" */ - { GLAMO_REG_MEM_TYPE, 0x0c74 }, /* 8MB, 16 word pg wr+rd */ - { GLAMO_REG_MEM_GEN, 0xafaf }, /* 63 grants min + max */ -- /* -- * the register below originally 0x0108 makes unreliable Glamo MMC -- * write operations. Cranked to 0x05ad to add a wait state, the -- * unreliability is not seen after 4GB of write / read testing -- */ -+ - { GLAMO_REG_MEM_TIMING1, 0x0108 }, - { GLAMO_REG_MEM_TIMING2, 0x0010 }, /* Taa = 3 MCLK */ - { GLAMO_REG_MEM_TIMING3, 0x0000 }, diff --git a/packages/linux/linux-openmoko/gta-vibro-pwm-suspend.patch b/packages/linux/linux-openmoko/gta-vibro-pwm-suspend.patch deleted file mode 100644 index a98f5c8ca5..0000000000 --- a/packages/linux/linux-openmoko/gta-vibro-pwm-suspend.patch +++ /dev/null @@ -1,27 +0,0 @@ -Index: linux-2.6.22/drivers/leds/leds-gta01.c -=================================================================== ---- linux-2.6.22.orig/drivers/leds/leds-gta01.c 2007-11-09 16:27:03.000000000 +0000 -+++ linux-2.6.22/drivers/leds/leds-gta01.c 2007-11-09 16:27:13.000000000 +0000 -@@ -33,6 +33,8 @@ - struct s3c2410_pwm pwm; - }; - -+static int gta01vib_init_hw(struct gta01_vib_priv *vp); -+ - static inline struct gta01_vib_priv *pdev_to_vpriv(struct platform_device *dev) - { - return platform_get_drvdata(dev); -@@ -80,7 +82,13 @@ - - static int gta01vib_resume(struct platform_device *dev) - { -+ struct gta01_vib_priv *vp = pdev_to_vpriv(dev); -+ - led_classdev_resume(>a01_vib_led); -+ -+ if (vp->has_pwm) -+ gta01vib_init_hw(vp); -+ - return 0; - } - #endif diff --git a/packages/linux/linux-openmoko/gta02-sound.patch b/packages/linux/linux-openmoko/gta02-sound.patch deleted file mode 100644 index f742c77303..0000000000 --- a/packages/linux/linux-openmoko/gta02-sound.patch +++ /dev/null @@ -1,754 +0,0 @@ -Index: linux-2.6.22/sound/soc/s3c24xx/neo1973_gta02_wm8753.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.22/sound/soc/s3c24xx/neo1973_gta02_wm8753.c 2007-11-09 16:21:35.000000000 +0000 -@@ -0,0 +1,667 @@ -+/* -+ * neo1973_gta02_wm8753.c -- SoC audio for Neo1973 -+ * -+ * Copyright 2007 OpenMoko Inc -+ * Author: Graeme Gregory <graeme@openmoko.org> -+ * Copyright 2007 Wolfson Microelectronics PLC. -+ * Author: Graeme Gregory <linux@wolfsonmicro.com> -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ * -+ * Revision history -+ * 06th Nov 2007 Changed from GTA01 to GTA02 -+ * 20th Jan 2007 Initial version. -+ * 05th Feb 2007 Rename all to Neo1973 -+ * -+ */ -+ -+#include <linux/module.h> -+#include <linux/moduleparam.h> -+#include <linux/timer.h> -+#include <linux/interrupt.h> -+#include <linux/platform_device.h> -+#include <linux/i2c.h> -+#include <sound/driver.h> -+#include <sound/core.h> -+#include <sound/pcm.h> -+#include <sound/soc.h> -+#include <sound/soc-dapm.h> -+ -+#include <asm/mach-types.h> -+#include <asm/hardware/scoop.h> -+#include <asm/arch/regs-iis.h> -+#include <asm/arch/regs-clock.h> -+#include <asm/arch/regs-gpio.h> -+#include <asm/hardware.h> -+#include <asm/arch/audio.h> -+#include <asm/io.h> -+#include <asm/arch/spi-gpio.h> -+#include <asm/arch/regs-gpioj.h> -+#include <asm/arch/gta02.h> -+#include "../codecs/wm8753.h" -+#include "s3c24xx-pcm.h" -+#include "s3c24xx-i2s.h" -+ -+/* define the scenarios */ -+#define NEO_AUDIO_OFF 0 -+#define NEO_GSM_CALL_AUDIO_HANDSET 1 -+#define NEO_GSM_CALL_AUDIO_HEADSET 2 -+#define NEO_GSM_CALL_AUDIO_BLUETOOTH 3 -+#define NEO_STEREO_TO_SPEAKERS 4 -+#define NEO_STEREO_TO_HEADPHONES 5 -+#define NEO_CAPTURE_HANDSET 6 -+#define NEO_CAPTURE_HEADSET 7 -+#define NEO_CAPTURE_BLUETOOTH 8 -+#define NEO_STEREO_TO_HANDSET_SPK 9 -+ -+static struct snd_soc_machine neo1973_gta02; -+ -+static int neo1973_gta02_hifi_hw_params(struct snd_pcm_substream *substream, -+ struct snd_pcm_hw_params *params) -+{ -+ struct snd_soc_pcm_runtime *rtd = substream->private_data; -+ struct snd_soc_codec_dai *codec_dai = rtd->dai->codec_dai; -+ struct snd_soc_cpu_dai *cpu_dai = rtd->dai->cpu_dai; -+ unsigned int pll_out = 0, bclk = 0; -+ int ret = 0; -+ unsigned long iis_clkrate; -+ -+ iis_clkrate = s3c24xx_i2s_get_clockrate(); -+ -+ switch (params_rate(params)) { -+ case 8000: -+ case 16000: -+ pll_out = 12288000; -+ break; -+ case 48000: -+ bclk = WM8753_BCLK_DIV_4; -+ pll_out = 12288000; -+ break; -+ case 96000: -+ bclk = WM8753_BCLK_DIV_2; -+ pll_out = 12288000; -+ break; -+ case 11025: -+ bclk = WM8753_BCLK_DIV_16; -+ pll_out = 11289600; -+ break; -+ case 22050: -+ bclk = WM8753_BCLK_DIV_8; -+ pll_out = 11289600; -+ break; -+ case 44100: -+ bclk = WM8753_BCLK_DIV_4; -+ pll_out = 11289600; -+ break; -+ case 88200: -+ bclk = WM8753_BCLK_DIV_2; -+ pll_out = 11289600; -+ break; -+ } -+ -+ /* set codec DAI configuration */ -+ ret = codec_dai->dai_ops.set_fmt(codec_dai, -+ SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | -+ SND_SOC_DAIFMT_CBM_CFM); -+ if (ret < 0) -+ return ret; -+ -+ /* set cpu DAI configuration */ -+ ret = cpu_dai->dai_ops.set_fmt(cpu_dai, -+ SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | -+ SND_SOC_DAIFMT_CBM_CFM); -+ if (ret < 0) -+ return ret; -+ -+ /* set the codec system clock for DAC and ADC */ -+ ret = codec_dai->dai_ops.set_sysclk(codec_dai, WM8753_MCLK, pll_out, -+ SND_SOC_CLOCK_IN); -+ if (ret < 0) -+ return ret; -+ -+ /* set MCLK division for sample rate */ -+ ret = cpu_dai->dai_ops.set_clkdiv(cpu_dai, S3C24XX_DIV_MCLK, -+ S3C2410_IISMOD_32FS ); -+ if (ret < 0) -+ return ret; -+ -+ /* set codec BCLK division for sample rate */ -+ ret = codec_dai->dai_ops.set_clkdiv(codec_dai, -+ WM8753_BCLKDIV, bclk); -+ if (ret < 0) -+ return ret; -+ -+ /* set prescaler division for sample rate */ -+ ret = cpu_dai->dai_ops.set_clkdiv(cpu_dai, S3C24XX_DIV_PRESCALER, -+ S3C24XX_PRESCALE(4,4)); -+ if (ret < 0) -+ return ret; -+ -+ /* codec PLL input is PCLK/4 */ -+ ret = codec_dai->dai_ops.set_pll(codec_dai, WM8753_PLL1, -+ iis_clkrate / 4, pll_out); -+ if (ret < 0) -+ return ret; -+ -+ return 0; -+} -+ -+static int neo1973_gta02_hifi_hw_free(struct snd_pcm_substream *substream) -+{ -+ struct snd_soc_pcm_runtime *rtd = substream->private_data; -+ struct snd_soc_codec_dai *codec_dai = rtd->dai->codec_dai; -+ -+ /* disable the PLL */ -+ return codec_dai->dai_ops.set_pll(codec_dai, WM8753_PLL1, 0, 0); -+} -+ -+/* -+ * Neo1973 WM8753 HiFi DAI opserations. -+ */ -+static struct snd_soc_ops neo1973_gta02_hifi_ops = { -+ .hw_params = neo1973_gta02_hifi_hw_params, -+ .hw_free = neo1973_gta02_hifi_hw_free, -+}; -+ -+static int neo1973_gta02_voice_hw_params( -+ struct snd_pcm_substream *substream, -+ struct snd_pcm_hw_params *params) -+{ -+ struct snd_soc_pcm_runtime *rtd = substream->private_data; -+ struct snd_soc_codec_dai *codec_dai = rtd->dai->codec_dai; -+ unsigned int pcmdiv = 0; -+ int ret = 0; -+ unsigned long iis_clkrate; -+ -+ iis_clkrate = s3c24xx_i2s_get_clockrate(); -+ -+ if (params_rate(params) != 8000) -+ return -EINVAL; -+ if (params_channels(params) != 1) -+ return -EINVAL; -+ -+ pcmdiv = WM8753_PCM_DIV_6; /* 2.048 MHz */ -+ -+ /* todo: gg check mode (DSP_B) against CSR datasheet */ -+ /* set codec DAI configuration */ -+ ret = codec_dai->dai_ops.set_fmt(codec_dai, SND_SOC_DAIFMT_DSP_B | -+ SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS); -+ if (ret < 0) -+ return ret; -+ -+ /* set the codec system clock for DAC and ADC */ -+ ret = codec_dai->dai_ops.set_sysclk(codec_dai, WM8753_PCMCLK, -+ 12288000, SND_SOC_CLOCK_IN); -+ if (ret < 0) -+ return ret; -+ -+ /* set codec PCM division for sample rate */ -+ ret = codec_dai->dai_ops.set_clkdiv(codec_dai, WM8753_PCMDIV, -+ pcmdiv); -+ if (ret < 0) -+ return ret; -+ -+ /* configue and enable PLL for 12.288MHz output */ -+ ret = codec_dai->dai_ops.set_pll(codec_dai, WM8753_PLL2, -+ iis_clkrate / 4, 12288000); -+ if (ret < 0) -+ return ret; -+ -+ return 0; -+} -+ -+static int neo1973_gta02_voice_hw_free(struct snd_pcm_substream *substream) -+{ -+ struct snd_soc_pcm_runtime *rtd = substream->private_data; -+ struct snd_soc_codec_dai *codec_dai = rtd->dai->codec_dai; -+ -+ /* disable the PLL */ -+ return codec_dai->dai_ops.set_pll(codec_dai, WM8753_PLL2, 0, 0); -+} -+ -+static struct snd_soc_ops neo1973_gta02_voice_ops = { -+ .hw_params = neo1973_gta02_voice_hw_params, -+ .hw_free = neo1973_gta02_voice_hw_free, -+}; -+ -+#define LM4853_AMP 1 -+#define LM4853_SPK 2 -+ -+static u8 lm4853_state=0; -+ -+static int lm4853_set_state(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_value *ucontrol) -+{ -+ int val = ucontrol->value.integer.value[0]; -+ -+ if(val) { -+ lm4853_state |= LM4853_AMP; -+ s3c2410_gpio_setpin(GTA02_GPIO_AMP_SHUT,0); -+ } else { -+ lm4853_state &= ~LM4853_AMP; -+ s3c2410_gpio_setpin(GTA02_GPIO_AMP_SHUT,1); -+ } -+ -+ return 0; -+} -+ -+static int lm4853_get_state(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_value *ucontrol) -+{ -+ ucontrol->value.integer.value[0] = lm4853_state & LM4853_AMP; -+ -+ return 0; -+} -+ -+static int lm4853_set_spk(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_value *ucontrol) -+{ -+ int val = ucontrol->value.integer.value[0]; -+ -+ if(val) { -+ lm4853_state |= LM4853_SPK; -+ s3c2410_gpio_setpin(GTA02_GPIO_HP_IN,0); -+ } else { -+ lm4853_state &= ~LM4853_SPK; -+ s3c2410_gpio_setpin(GTA02_GPIO_HP_IN,1); -+ } -+ -+ return 0; -+} -+ -+static int lm4853_get_spk(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_value *ucontrol) -+{ -+ ucontrol->value.integer.value[0] = (lm4853_state & LM4853_SPK) >> 1; -+ -+ return 0; -+} -+ -+static int neo1973_gta02_set_stereo_out(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_value *ucontrol) -+{ -+ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); -+ int val = ucontrol->value.integer.value[0]; -+ -+ snd_soc_dapm_set_endpoint(codec, "Stereo Out", val); -+ -+ snd_soc_dapm_sync_endpoints(codec); -+ -+ return 0; -+} -+ -+static int neo1973_gta02_get_stereo_out(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_value *ucontrol) -+{ -+ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); -+ -+ ucontrol->value.integer.value[0] = -+ snd_soc_dapm_get_endpoint(codec, "Stereo Out"); -+ -+ return 0; -+} -+ -+ -+static int neo1973_gta02_set_gsm_out(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_value *ucontrol) -+{ -+ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); -+ int val = ucontrol->value.integer.value[0]; -+ -+ snd_soc_dapm_set_endpoint(codec, "GSM Line Out", val); -+ -+ snd_soc_dapm_sync_endpoints(codec); -+ -+ return 0; -+} -+ -+static int neo1973_gta02_get_gsm_out(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_value *ucontrol) -+{ -+ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); -+ -+ ucontrol->value.integer.value[0] = -+ snd_soc_dapm_get_endpoint(codec, "GSM Line Out"); -+ -+ return 0; -+} -+ -+static int neo1973_gta02_set_gsm_in(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_value *ucontrol) -+{ -+ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); -+ int val = ucontrol->value.integer.value[0]; -+ -+ snd_soc_dapm_set_endpoint(codec, "GSM Line In", val); -+ -+ snd_soc_dapm_sync_endpoints(codec); -+ -+ return 0; -+} -+ -+static int neo1973_gta02_get_gsm_in(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_value *ucontrol) -+{ -+ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); -+ -+ ucontrol->value.integer.value[0] = -+ snd_soc_dapm_get_endpoint(codec, "GSM Line In"); -+ -+ return 0; -+} -+ -+static int neo1973_gta02_set_headset_mic(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_value *ucontrol) -+{ -+ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); -+ int val = ucontrol->value.integer.value[0]; -+ -+ snd_soc_dapm_set_endpoint(codec, "Headset Mic", val); -+ -+ snd_soc_dapm_sync_endpoints(codec); -+ -+ return 0; -+} -+ -+static int neo1973_gta02_get_headset_mic(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_value *ucontrol) -+{ -+ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); -+ -+ ucontrol->value.integer.value[0] = -+ snd_soc_dapm_get_endpoint(codec, "Headset Mic"); -+ -+ return 0; -+} -+ -+static int neo1973_gta02_set_handset_mic(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_value *ucontrol) -+{ -+ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); -+ int val = ucontrol->value.integer.value[0]; -+ -+ snd_soc_dapm_set_endpoint(codec, "Handset Mic", val); -+ -+ snd_soc_dapm_sync_endpoints(codec); -+ -+ return 0; -+} -+ -+static int neo1973_gta02_get_handset_mic(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_value *ucontrol) -+{ -+ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); -+ -+ ucontrol->value.integer.value[0] = -+ snd_soc_dapm_get_endpoint(codec, "Handset Mic"); -+ -+ return 0; -+} -+ -+static int neo1973_gta02_set_handset_spk(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_value *ucontrol) -+{ -+ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); -+ int val = ucontrol->value.integer.value[0]; -+ -+ snd_soc_dapm_set_endpoint(codec, "Handset Spk", val); -+ -+ snd_soc_dapm_sync_endpoints(codec); -+ -+ return 0; -+} -+ -+static int neo1973_gta02_get_handset_spk(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_value *ucontrol) -+{ -+ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); -+ -+ ucontrol->value.integer.value[0] = -+ snd_soc_dapm_get_endpoint(codec, "Handset Spk"); -+ -+ return 0; -+} -+ -+static const struct snd_soc_dapm_widget wm8753_dapm_widgets[] = { -+ SND_SOC_DAPM_LINE("Stereo Out", NULL), -+ SND_SOC_DAPM_LINE("GSM Line Out", NULL), -+ SND_SOC_DAPM_LINE("GSM Line In", NULL), -+ SND_SOC_DAPM_MIC("Headset Mic", NULL), -+ SND_SOC_DAPM_MIC("Handset Mic", NULL), -+ SND_SOC_DAPM_SPK("Handset Spk", NULL), -+}; -+ -+ -+/* example machine audio_mapnections */ -+static const char* audio_map[][3] = { -+ -+ /* Connections to the lm4853 amp */ -+ {"Stereo Out", NULL, "LOUT1"}, -+ {"Stereo Out", NULL, "ROUT1"}, -+ -+ /* Connections to the GSM Module */ -+ {"GSM Line Out", NULL, "MONO1"}, -+ {"GSM Line Out", NULL, "MONO2"}, -+ {"RXP", NULL, "GSM Line In"}, -+ {"RXN", NULL, "GSM Line In"}, -+ -+ /* Connections to Headset */ -+ {"MIC1", NULL, "Mic Bias"}, -+ {"Mic Bias", NULL, "Headset Mic"}, -+ -+ /* Call Mic */ -+ {"MIC2", NULL, "Mic Bias"}, -+ {"MIC2N", NULL, "Mic Bias"}, -+ {"Mic Bias", NULL, "Handset Mic"}, -+ -+ /* Call Speaker */ -+ {"Handset Spk", NULL, "LOUT2"}, -+ {"Handset Spk", NULL, "ROUT2"}, -+ -+ /* Connect the ALC pins */ -+ {"ACIN", NULL, "ACOP"}, -+ -+ {NULL, NULL, NULL}, -+}; -+ -+static const struct snd_kcontrol_new wm8753_neo1973_gta02_controls[] = { -+ SOC_SINGLE_EXT("DAPM Stereo Out Switch", 0, 0, 1, 0, -+ neo1973_gta02_get_stereo_out, -+ neo1973_gta02_set_stereo_out), -+ SOC_SINGLE_EXT("DAPM GSM Line Out Switch", 1, 0, 1, 0, -+ neo1973_gta02_get_gsm_out, -+ neo1973_gta02_set_gsm_out), -+ SOC_SINGLE_EXT("DAPM GSM Line In Switch", 2, 0, 1, 0, -+ neo1973_gta02_get_gsm_in, -+ neo1973_gta02_set_gsm_in), -+ SOC_SINGLE_EXT("DAPM Headset Mic Switch", 3, 0, 1, 0, -+ neo1973_gta02_get_headset_mic, -+ neo1973_gta02_set_headset_mic), -+ SOC_SINGLE_EXT("DAPM Handset Mic Switch", 4, 0, 1, 0, -+ neo1973_gta02_get_handset_mic, -+ neo1973_gta02_set_handset_mic), -+ SOC_SINGLE_EXT("DAPM Handset Spk Switch", 5, 0, 1, 0, -+ neo1973_gta02_get_handset_spk, -+ neo1973_gta02_set_handset_spk), -+ SOC_SINGLE_EXT("Amp State Switch", 6, 0, 1, 0, -+ lm4853_get_state, -+ lm4853_set_state), -+ SOC_SINGLE_EXT("Amp Spk Switch", 7, 0, 1, 0, -+ lm4853_get_spk, -+ lm4853_set_spk), -+}; -+ -+/* -+ * This is an example machine initialisation for a wm8753 connected to a -+ * neo1973 GTA02. -+ */ -+static int neo1973_gta02_wm8753_init(struct snd_soc_codec *codec) -+{ -+ int i, err; -+ -+ /* set up NC codec pins */ -+ snd_soc_dapm_set_endpoint(codec, "OUT3", 0); -+ snd_soc_dapm_set_endpoint(codec, "OUT4", 0); -+ snd_soc_dapm_set_endpoint(codec, "LINE1", 0); -+ snd_soc_dapm_set_endpoint(codec, "LINE2", 0); -+ -+ /* Add neo1973 gta02 specific widgets */ -+ for (i = 0; i < ARRAY_SIZE(wm8753_dapm_widgets); i++) -+ snd_soc_dapm_new_control(codec, &wm8753_dapm_widgets[i]); -+ -+ /* add neo1973 gta02 specific controls */ -+ for (i = 0; i < ARRAY_SIZE(wm8753_neo1973_gta02_controls); i++) { -+ err = snd_ctl_add(codec->card, -+ snd_soc_cnew(&wm8753_neo1973_gta02_controls[i], -+ codec, NULL)); -+ if (err < 0) -+ return err; -+ } -+ -+ /* set up neo1973 gta02 specific audio path audio_mapnects */ -+ for (i = 0; audio_map[i][0] != NULL; i++) { -+ snd_soc_dapm_connect_input(codec, audio_map[i][0], -+ audio_map[i][1], audio_map[i][2]); -+ } -+ -+ /* set endpoints to default off mode */ -+ snd_soc_dapm_set_endpoint(codec, "Stereo Out", 0); -+ snd_soc_dapm_set_endpoint(codec, "GSM Line Out",0); -+ snd_soc_dapm_set_endpoint(codec, "GSM Line In", 0); -+ snd_soc_dapm_set_endpoint(codec, "Headset Mic", 0); -+ snd_soc_dapm_set_endpoint(codec, "Handset Mic", 0); -+ snd_soc_dapm_set_endpoint(codec, "Handset Spk", 0); -+ -+ snd_soc_dapm_sync_endpoints(codec); -+ return 0; -+} -+ -+/* -+ * BT Codec DAI -+ */ -+static struct snd_soc_cpu_dai bt_dai = -+{ .name = "Bluetooth", -+ .id = 0, -+ .type = SND_SOC_DAI_PCM, -+ .playback = { -+ .channels_min = 1, -+ .channels_max = 1, -+ .rates = SNDRV_PCM_RATE_8000, -+ .formats = SNDRV_PCM_FMTBIT_S16_LE,}, -+ .capture = { -+ .channels_min = 1, -+ .channels_max = 1, -+ .rates = SNDRV_PCM_RATE_8000, -+ .formats = SNDRV_PCM_FMTBIT_S16_LE,}, -+}; -+ -+static struct snd_soc_dai_link neo1973_gta02_dai[] = { -+{ /* Hifi Playback - for similatious use with voice below */ -+ .name = "WM8753", -+ .stream_name = "WM8753 HiFi", -+ .cpu_dai = &s3c24xx_i2s_dai, -+ .codec_dai = &wm8753_dai[WM8753_DAI_HIFI], -+ .init = neo1973_gta02_wm8753_init, -+ .ops = &neo1973_gta02_hifi_ops, -+}, -+{ /* Voice via BT */ -+ .name = "Bluetooth", -+ .stream_name = "Voice", -+ .cpu_dai = &bt_dai, -+ .codec_dai = &wm8753_dai[WM8753_DAI_VOICE], -+ .ops = &neo1973_gta02_voice_ops, -+}, -+}; -+ -+#ifdef CONFIG_PM -+int neo1973_gta02_suspend(struct platform_device *pdev, pm_message_t state) -+{ -+ s3c2410_gpio_setpin(GTA02_GPIO_AMP_SHUT, 1); -+ -+ return 0; -+} -+ -+int neo1973_gta02_resume(struct platform_device *pdev) -+{ -+ if(lm4853_state & LM4853_AMP) -+ s3c2410_gpio_setpin(GTA02_GPIO_AMP_SHUT, 0); -+ -+ return 0; -+} -+#else -+#define neo1973_gta02_suspend NULL -+#define neo1973_gta02_resume NULL -+#endif -+ -+static struct snd_soc_machine neo1973_gta02 = { -+ .name = "neo1973-gta02", -+ .suspend_pre = neo1973_gta02_suspend, -+ .resume_post = neo1973_gta02_resume, -+ .dai_link = neo1973_gta02_dai, -+ .num_links = ARRAY_SIZE(neo1973_gta02_dai), -+}; -+ -+static struct wm8753_setup_data neo1973_gta02_wm8753_setup = { -+ .i2c_address = 0x1a, -+}; -+ -+static struct snd_soc_device neo1973_gta02_snd_devdata = { -+ .machine = &neo1973_gta02, -+ .platform = &s3c24xx_soc_platform, -+ .codec_dev = &soc_codec_dev_wm8753, -+ .codec_data = &neo1973_gta02_wm8753_setup, -+}; -+ -+static struct platform_device *neo1973_gta02_snd_device; -+ -+static int __init neo1973_gta02_init(void) -+{ -+ int ret; -+ -+ if (!machine_is_neo1973_gta02()) { -+ printk(KERN_INFO -+ "Only GTA02 hardware supported by ASoc driver\n"); -+ return -ENODEV; -+ } -+ -+ neo1973_gta02_snd_device = platform_device_alloc("soc-audio", -1); -+ if (!neo1973_gta02_snd_device) -+ return -ENOMEM; -+ -+ platform_set_drvdata(neo1973_gta02_snd_device, -+ &neo1973_gta02_snd_devdata); -+ neo1973_gta02_snd_devdata.dev = &neo1973_gta02_snd_device->dev; -+ ret = platform_device_add(neo1973_gta02_snd_device); -+ -+ if (ret) -+ platform_device_put(neo1973_gta02_snd_device); -+ -+ /* Initialise GPIOs used by amp */ -+ s3c2410_gpio_cfgpin(GTA02_GPIO_HP_IN, S3C2410_GPIO_OUTPUT); -+ s3c2410_gpio_cfgpin(GTA02_GPIO_AMP_SHUT, S3C2410_GPIO_OUTPUT); -+ -+ /* Amp off by default */ -+ s3c2410_gpio_setpin(GTA02_GPIO_AMP_SHUT, 1); -+ -+ /* Speaker off by default */ -+ s3c2410_gpio_setpin(GTA02_GPIO_HP_IN, 1); -+ -+ return ret; -+} -+ -+static void __exit neo1973_gta02_exit(void) -+{ -+ platform_device_unregister(neo1973_gta02_snd_device); -+} -+ -+module_init(neo1973_gta02_init); -+module_exit(neo1973_gta02_exit); -+ -+/* Module information */ -+MODULE_AUTHOR("Graeme Gregory, graeme@openmoko.org"); -+MODULE_DESCRIPTION("ALSA SoC WM8753 Neo1973 GTA02"); -+MODULE_LICENSE("GPL"); -+ -Index: linux-2.6.22/sound/soc/s3c24xx/Kconfig -=================================================================== ---- linux-2.6.22.orig/sound/soc/s3c24xx/Kconfig 2007-11-09 16:13:04.000000000 +0000 -+++ linux-2.6.22/sound/soc/s3c24xx/Kconfig 2007-11-09 16:13:08.000000000 +0000 -@@ -25,6 +25,15 @@ - Say Y if you want to add support for SoC audio on smdk2440 - with the WM8753. - -+config SND_S3C24XX_SOC_NEO1973_GTA02_WM8753 -+ tristate "SoC I2S Audio support for NEO1973 GTA02 - WM8753" -+ depends on SND_S3C24XX_SOC && MACH_NEO1973_GTA02 -+ select SND_S3C24XX_SOC_I2S -+ select SND_SOC_WM8753 -+ help -+ Say Y if you want to add support for SoC audio on neo1973 gta02 -+ with the WM8753 codec -+ - config SND_S3C24XX_SOC_SMDK2443_WM9710 - tristate "SoC AC97 Audio support for SMDK2443 - WM9710" - depends on SND_S3C24XX_SOC && MACH_SMDK2443 -Index: linux-2.6.22/sound/soc/s3c24xx/Makefile -=================================================================== ---- linux-2.6.22.orig/sound/soc/s3c24xx/Makefile 2007-11-09 16:13:04.000000000 +0000 -+++ linux-2.6.22/sound/soc/s3c24xx/Makefile 2007-11-09 16:13:08.000000000 +0000 -@@ -10,6 +10,9 @@ - # S3C24XX Machine Support - snd-soc-neo1973-wm8753-objs := neo1973_wm8753.o - snd-soc-smdk2443-wm9710-objs := smdk2443_wm9710.o -+snd-soc-neo1973-gta02-wm8753-objs := neo1973_gta02_wm8753.o - - obj-$(CONFIG_SND_S3C24XX_SOC_NEO1973_WM8753) += snd-soc-neo1973-wm8753.o - obj-$(CONFIG_SND_S3C24XX_SOC_SMDK2443_WM9710) += snd-soc-smdk2443-wm9710.o -+obj-$(CONFIG_SND_S3C24XX_SOC_NEO1973_GTA02_WM8753) += snd-soc-neo1973-gta02-wm8753.o -+ -Index: linux-2.6.22/include/sound/soc-dapm.h -=================================================================== ---- linux-2.6.22.orig/include/sound/soc-dapm.h 2007-07-09 00:32:17.000000000 +0100 -+++ linux-2.6.22/include/sound/soc-dapm.h 2007-11-09 16:13:08.000000000 +0000 -@@ -206,6 +206,8 @@ - /* dapm audio endpoint control */ - int snd_soc_dapm_set_endpoint(struct snd_soc_codec *codec, - char *pin, int status); -+int snd_soc_dapm_get_endpoint(struct snd_soc_codec *codec, -+ char *pin); - int snd_soc_dapm_sync_endpoints(struct snd_soc_codec *codec); - - /* dapm widget types */ -Index: linux-2.6.22/sound/soc/soc-dapm.c -=================================================================== ---- linux-2.6.22.orig/sound/soc/soc-dapm.c 2007-07-09 00:32:17.000000000 +0100 -+++ linux-2.6.22/sound/soc/soc-dapm.c 2007-11-09 16:13:08.000000000 +0000 -@@ -1305,6 +1305,30 @@ - EXPORT_SYMBOL_GPL(snd_soc_dapm_set_endpoint); - - /** -+ * snd_soc_dapm_get_endpoint - get audio endpoint status -+ * @codec: audio codec -+ * @endpoint: audio signal endpoint (or start point) -+ * -+ * Get audio endpoint status - connected or disconnected. -+ * -+ * Returns status -+ */ -+int snd_soc_dapm_get_endpoint(struct snd_soc_codec *codec, -+ char *endpoint) -+{ -+ struct snd_soc_dapm_widget *w; -+ -+ list_for_each_entry(w, &codec->dapm_widgets, list) { -+ if (!strcmp(w->name, endpoint)) { -+ return w->connected; -+ } -+ } -+ -+ return 0; -+} -+EXPORT_SYMBOL_GPL(snd_soc_dapm_get_endpoint); -+ -+/** - * snd_soc_dapm_free - free dapm resources - * @socdev: SoC device - * diff --git a/packages/linux/linux-openmoko/iis-suspend.patch b/packages/linux/linux-openmoko/iis-suspend.patch deleted file mode 100644 index ab38672463..0000000000 --- a/packages/linux/linux-openmoko/iis-suspend.patch +++ /dev/null @@ -1,63 +0,0 @@ -Index: linux-2.6.22/sound/soc/s3c24xx/s3c24xx-i2s.c -=================================================================== ---- linux-2.6.22.orig/sound/soc/s3c24xx/s3c24xx-i2s.c 2007-11-09 16:13:04.000000000 +0000 -+++ linux-2.6.22/sound/soc/s3c24xx/s3c24xx-i2s.c 2007-11-09 16:17:47.000000000 +0000 -@@ -75,6 +75,10 @@ - struct s3c24xx_i2s_info { - void __iomem *regs; - struct clk *iis_clk; -+ u32 iiscon; -+ u32 iismod; -+ u32 iisfcon; -+ u32 iispsr; - }; - static struct s3c24xx_i2s_info s3c24xx_i2s; - -@@ -404,6 +408,38 @@ - return 0; - } - -+#ifdef CONFIG_PM -+int s3c24xx_i2s_suspend(struct platform_device *pdev, -+ struct snd_soc_cpu_dai *cpu_dai) -+{ -+ s3c24xx_i2s.iiscon=readl(s3c24xx_i2s.regs + S3C2410_IISCON); -+ s3c24xx_i2s.iismod=readl(s3c24xx_i2s.regs + S3C2410_IISMOD); -+ s3c24xx_i2s.iisfcon=readl(s3c24xx_i2s.regs + S3C2410_IISFCON); -+ s3c24xx_i2s.iispsr=readl(s3c24xx_i2s.regs + S3C2410_IISPSR); -+ -+ clk_disable(s3c24xx_i2s.iis_clk); -+ -+ return 0; -+} -+ -+int s3c24xx_i2s_resume(struct platform_device *pdev, -+ struct snd_soc_cpu_dai *cpu_dai) -+{ -+ clk_enable(s3c24xx_i2s.iis_clk); -+ -+ writel(s3c24xx_i2s.iiscon, s3c24xx_i2s.regs + S3C2410_IISCON); -+ writel(s3c24xx_i2s.iismod, s3c24xx_i2s.regs + S3C2410_IISMOD); -+ writel(s3c24xx_i2s.iisfcon, s3c24xx_i2s.regs + S3C2410_IISFCON); -+ writel(s3c24xx_i2s.iispsr, s3c24xx_i2s.regs + S3C2410_IISPSR); -+ -+ return 0; -+} -+#else -+#define s3c24xx_i2s_suspend NULL -+#define s3c24xx_i2s_resume NULL -+#endif -+ -+ - #define S3C24XX_I2S_RATES \ - (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \ - SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \ -@@ -414,6 +450,8 @@ - .id = 0, - .type = SND_SOC_DAI_I2S, - .probe = s3c24xx_i2s_probe, -+ .suspend = s3c24xx_i2s_suspend, -+ .resume = s3c24xx_i2s_resume, - .playback = { - .channels_min = 2, - .channels_max = 2, diff --git a/packages/linux/linux-openmoko/s3c24xx-pcm-suspend.patch b/packages/linux/linux-openmoko/s3c24xx-pcm-suspend.patch deleted file mode 100644 index fffc685a4e..0000000000 --- a/packages/linux/linux-openmoko/s3c24xx-pcm-suspend.patch +++ /dev/null @@ -1,73 +0,0 @@ -Index: linux-2.6.22/sound/soc/s3c24xx/s3c24xx-pcm.c -=================================================================== ---- linux-2.6.22.orig/sound/soc/s3c24xx/s3c24xx-pcm.c 2007-11-09 16:28:43.000000000 +0000 -+++ linux-2.6.22/sound/soc/s3c24xx/s3c24xx-pcm.c 2007-11-09 16:33:05.000000000 +0000 -@@ -49,7 +49,9 @@ - .info = SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP | -- SNDRV_PCM_INFO_MMAP_VALID, -+ SNDRV_PCM_INFO_MMAP_VALID | -+ SNDRV_PCM_INFO_PAUSE | -+ SNDRV_PCM_INFO_RESUME, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_U16_LE | - SNDRV_PCM_FMTBIT_U8 | -@@ -176,28 +178,6 @@ - } - } - -- /* channel needs configuring for mem=>device, increment memory addr, -- * sync to pclk, half-word transfers to the IIS-FIFO. */ -- if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { -- s3c2410_dma_devconfig(prtd->params->channel, -- S3C2410_DMASRC_MEM, S3C2410_DISRCC_INC | -- S3C2410_DISRCC_APB, prtd->params->dma_addr); -- -- s3c2410_dma_config(prtd->params->channel, -- prtd->params->dma_size, -- S3C2410_DCON_SYNC_PCLK | -- S3C2410_DCON_HANDSHAKE); -- } else { -- s3c2410_dma_config(prtd->params->channel, -- prtd->params->dma_size, -- S3C2410_DCON_HANDSHAKE | -- S3C2410_DCON_SYNC_PCLK); -- -- s3c2410_dma_devconfig(prtd->params->channel, -- S3C2410_DMASRC_HW, 0x3, -- prtd->params->dma_addr); -- } -- - s3c2410_dma_set_buffdone_fn(prtd->params->channel, - s3c24xx_audio_buffdone); - -@@ -246,6 +226,28 @@ - if (!prtd->params) - return 0; - -+ /* channel needs configuring for mem=>device, increment memory addr, -+ * sync to pclk, half-word transfers to the IIS-FIFO. */ -+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { -+ s3c2410_dma_devconfig(prtd->params->channel, -+ S3C2410_DMASRC_MEM, S3C2410_DISRCC_INC | -+ S3C2410_DISRCC_APB, prtd->params->dma_addr); -+ -+ s3c2410_dma_config(prtd->params->channel, -+ prtd->params->dma_size, -+ S3C2410_DCON_SYNC_PCLK | -+ S3C2410_DCON_HANDSHAKE); -+ } else { -+ s3c2410_dma_config(prtd->params->channel, -+ prtd->params->dma_size, -+ S3C2410_DCON_HANDSHAKE | -+ S3C2410_DCON_SYNC_PCLK); -+ -+ s3c2410_dma_devconfig(prtd->params->channel, -+ S3C2410_DMASRC_HW, 0x3, -+ prtd->params->dma_addr); -+ } -+ - /* flush the DMA channel */ - s3c2410_dma_ctrl(prtd->params->channel, S3C2410_DMAOP_FLUSH); - prtd->dma_loaded = 0; diff --git a/packages/linux/linux-openmoko/soc-core-suspend.patch b/packages/linux/linux-openmoko/soc-core-suspend.patch deleted file mode 100644 index 7fb6cc7f7a..0000000000 --- a/packages/linux/linux-openmoko/soc-core-suspend.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 6c868238a5e083dca4d74439a7fd467b5c7726b0 Mon Sep 17 00:00:00 2001 -From: Liam Girdwood <liam@localhost.localdomain> -Date: Fri, 1 Jun 2007 12:56:55 +0100 -Subject: [PATCH] This fixes a bug whereby PCM's were not being suspended when the rest of the audio subsystem was suspended. - ---- - include/sound/soc.h | 3 +++ - sound/soc/soc-core.c | 8 ++++++++ - 2 files changed, 11 insertions(+), 0 deletions(-) - -Index: linux-2.6.22/include/sound/soc.h -=================================================================== ---- linux-2.6.22.orig/include/sound/soc.h 2007-07-09 00:32:17.000000000 +0100 -+++ linux-2.6.22/include/sound/soc.h 2007-11-09 16:13:08.000000000 +0000 -@@ -411,6 +411,9 @@ - - /* codec/machine specific init - e.g. add machine controls */ - int (*init)(struct snd_soc_codec *codec); -+ -+ /* DAI pcm */ -+ struct snd_pcm *pcm; - }; - - /* SoC machine */ -Index: linux-2.6.22/sound/soc/soc-core.c -=================================================================== ---- linux-2.6.22.orig/sound/soc/soc-core.c 2007-07-09 00:32:17.000000000 +0100 -+++ linux-2.6.22/sound/soc/soc-core.c 2007-11-09 16:18:45.000000000 +0000 -@@ -639,6 +639,10 @@ - dai->dai_ops.digital_mute(dai, 1); - } - -+ /* suspend all pcm's */ -+ for(i = 0; i < machine->num_links; i++) -+ snd_pcm_suspend_all(machine->dai_link[i].pcm); -+ - if (machine->suspend_pre) - machine->suspend_pre(pdev, state); - -@@ -873,6 +877,7 @@ - return ret; - } - -+ dai_link->pcm = pcm; - pcm->private_data = rtd; - soc_pcm_ops.mmap = socdev->platform->pcm_ops->mmap; - soc_pcm_ops.pointer = socdev->platform->pcm_ops->pointer; diff --git a/packages/linux/linux-openmoko_2.6.24+git.bb b/packages/linux/linux-openmoko_2.6.24+git.bb index 541fac4dd8..6053ce8a7d 100644 --- a/packages/linux/linux-openmoko_2.6.24+git.bb +++ b/packages/linux/linux-openmoko_2.6.24+git.bb @@ -1,13 +1,13 @@ require linux.inc require linux-openmoko.inc -DESCRIPTION = "Linux 2.6.x (development) kernel for FIC SmartPhones shipping w/ Openmoko" +DESCRIPTION = "The Linux kernel for Openmoko SmartPhones" KERNEL_RELEASE = "2.6.24" KERNEL_VERSION = "${KERNEL_RELEASE}" PV = "${KERNEL_RELEASE}+${PR}+gitr${SRCREV}" -PR = "r7" +PR = "r0" SRC_URI = "\ git://git.openmoko.org/git/kernel.git;protocol=git;branch=stable \ @@ -18,8 +18,6 @@ SRC_URI = "\ file://0004-squashfs-Kconfig.patch;patch=1 \ file://0005-squashfs-Makefile.patch;patch=1 \ \ - file://glamo-turbo-mode.patch;patch=1 \ - \ file://defconfig-oe \ " S = "${WORKDIR}/git" |