diff options
14 files changed, 6 insertions, 1449 deletions
diff --git a/conf/distro/include/sane-srcrevs.inc b/conf/distro/include/sane-srcrevs.inc index ec9708dff8..f7f58d1f8e 100644 --- a/conf/distro/include/sane-srcrevs.inc +++ b/conf/distro/include/sane-srcrevs.inc @@ -79,7 +79,7 @@ SRCREV_pn-lightmediascanner ?= "68" SRCREV_pn-linux-bfin ?= "3758" SRCREV_pn-linux-hackndev-2.6 ?= "1308" SRCREV_pn-linux-ixp4xx ?= "1066" -SRCREV_pn-linux-openmoko ?= "ca19d156400f817960efe0d14680324b2ea34171" +SRCREV_pn-linux-openmoko ?= "968c41d0c32099d78927849a71e2ef3143cc05e7" SRCREV_pn-linux-openmoko-devel ?= "e20ce2bd6fc6e711eed58a580ae117cb574abe96" SRCREV_pn-llvm-gcc4 ?= "374" SRCREV_pn-llvm-gcc4-cross ?= "374" 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; -+} |
