···365365 select GENERIC_CLOCKEVENTS366366 select ARCH_REQUIRE_GPIOLIB367367 select CLKDEV_LOOKUP368368+ select HAVE_SCHED_CLOCK368369 help369370 Support for Freescale MXC/iMX-based family of processors370371
-2
arch/arm/include/asm/mach/udc_pxa2xx.h
···2020 * VBUS IRQ and omit the methods above. Store the GPIO number2121 * here. Note that sometimes the signals go through inverters...2222 */2323- bool gpio_vbus_inverted;2424- int gpio_vbus; /* high == vbus present */2523 bool gpio_pullup_inverted;2624 int gpio_pullup; /* high == pullup activated */2725};
···165165 select IMX_HAVE_PLATFORM_IMX_I2C166166 select IMX_HAVE_PLATFORM_IMX_UART167167 select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX168168+ select IMX_HAVE_PLATFORM_GPIO_KEYS168169 help169170 Include support for MX53 LOCO platform. This includes specific170171 configurations for the board and its peripherals.
···11+/*22+ * Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved.33+ */44+55+/*66+ * The code contained herein is licensed under the GNU General Public77+ * License. You may obtain a copy of the GNU General Public License88+ * Version 2 or later at the following locations:99+ *1010+ * http://www.opensource.org/licenses/gpl-license.html1111+ * http://www.gnu.org/copyleft/gpl.html1212+ */1313+#include <linux/platform_device.h>1414+#include <linux/io.h>1515+#include <mach/hardware.h>1616+#include "crm_regs.h"1717+1818+/* set cpu low power mode before WFI instruction. This function is called1919+ * mx5 because it can be used for mx50, mx51, and mx53.*/2020+void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode)2121+{2222+ u32 plat_lpc, arm_srpgcr, ccm_clpcr;2323+ u32 empgc0, empgc1;2424+ int stop_mode = 0;2525+2626+ /* always allow platform to issue a deep sleep mode request */2727+ plat_lpc = __raw_readl(MXC_CORTEXA8_PLAT_LPC) &2828+ ~(MXC_CORTEXA8_PLAT_LPC_DSM);2929+ ccm_clpcr = __raw_readl(MXC_CCM_CLPCR) & ~(MXC_CCM_CLPCR_LPM_MASK);3030+ arm_srpgcr = __raw_readl(MXC_SRPG_ARM_SRPGCR) & ~(MXC_SRPGCR_PCR);3131+ empgc0 = __raw_readl(MXC_SRPG_EMPGC0_SRPGCR) & ~(MXC_SRPGCR_PCR);3232+ empgc1 = __raw_readl(MXC_SRPG_EMPGC1_SRPGCR) & ~(MXC_SRPGCR_PCR);3333+3434+ switch (mode) {3535+ case WAIT_CLOCKED:3636+ break;3737+ case WAIT_UNCLOCKED:3838+ ccm_clpcr |= 0x1 << MXC_CCM_CLPCR_LPM_OFFSET;3939+ break;4040+ case WAIT_UNCLOCKED_POWER_OFF:4141+ case STOP_POWER_OFF:4242+ plat_lpc |= MXC_CORTEXA8_PLAT_LPC_DSM4343+ | MXC_CORTEXA8_PLAT_LPC_DBG_DSM;4444+ if (mode == WAIT_UNCLOCKED_POWER_OFF) {4545+ ccm_clpcr |= 0x1 << MXC_CCM_CLPCR_LPM_OFFSET;4646+ ccm_clpcr &= ~MXC_CCM_CLPCR_VSTBY;4747+ ccm_clpcr &= ~MXC_CCM_CLPCR_SBYOS;4848+ stop_mode = 0;4949+ } else {5050+ ccm_clpcr |= 0x2 << MXC_CCM_CLPCR_LPM_OFFSET;5151+ ccm_clpcr |= 0x3 << MXC_CCM_CLPCR_STBY_COUNT_OFFSET;5252+ ccm_clpcr |= MXC_CCM_CLPCR_VSTBY;5353+ ccm_clpcr |= MXC_CCM_CLPCR_SBYOS;5454+ stop_mode = 1;5555+ }5656+ arm_srpgcr |= MXC_SRPGCR_PCR;5757+5858+ if (tzic_enable_wake(1) != 0)5959+ return;6060+ break;6161+ case STOP_POWER_ON:6262+ ccm_clpcr |= 0x2 << MXC_CCM_CLPCR_LPM_OFFSET;6363+ break;6464+ default:6565+ printk(KERN_WARNING "UNKNOWN cpu power mode: %d\n", mode);6666+ return;6767+ }6868+6969+ __raw_writel(plat_lpc, MXC_CORTEXA8_PLAT_LPC);7070+ __raw_writel(ccm_clpcr, MXC_CCM_CLPCR);7171+ __raw_writel(arm_srpgcr, MXC_SRPG_ARM_SRPGCR);7272+7373+ /* Enable NEON SRPG for all but MX50TO1.0. */7474+ if (mx50_revision() != IMX_CHIP_REVISION_1_0)7575+ __raw_writel(arm_srpgcr, MXC_SRPG_NEON_SRPGCR);7676+7777+ if (stop_mode) {7878+ empgc0 |= MXC_SRPGCR_PCR;7979+ empgc1 |= MXC_SRPGCR_PCR;8080+8181+ __raw_writel(empgc0, MXC_SRPG_EMPGC0_SRPGCR);8282+ __raw_writel(empgc1, MXC_SRPG_EMPGC1_SRPGCR);8383+ }8484+}
···128128 return 0;129129130130err_req_gpio:131131- while (i > 0)132132- gpio_free(gpios[i--]);131131+ while (--i >= 0)132132+ gpio_free(gpios[i]);133133134134 return err;135135}···194194};195195196196/* this gets called as part of our init. these steps must be done now so197197- * that we can use set_pxa_fb_info */197197+ * that we can use pxa_set_fb_info */198198static void __init am200_presetup_fb(void)199199{200200 int fw;···249249 /* we divide since we told the LCD controller we're 16bpp */250250 am200_fb_info.modes->xres /= 2;251251252252- set_pxa_fb_info(&am200_fb_info);252252+ pxa_set_fb_info(NULL, &am200_fb_info);253253254254}255255
+7-6
arch/arm/mach-pxa/am300epd.c
···125125 if (err) {126126 dev_err(&am300_device->dev, "failed requesting "127127 "gpio %d, err=%d\n", i, err);128128- while (i >= DB0_GPIO_PIN)129129- gpio_free(i--);130130- i = ARRAY_SIZE(gpios) - 1;131131- goto err_req_gpio;128128+ goto err_req_gpio2;132129 }133130 }134131···156159157160 return 0;158161162162+err_req_gpio2:163163+ while (--i >= DB0_GPIO_PIN)164164+ gpio_free(i);165165+ i = ARRAY_SIZE(gpios);159166err_req_gpio:160160- while (i > 0)161161- gpio_free(gpios[i--]);167167+ while (--i >= 0)168168+ gpio_free(gpios[i]);162169163170 return err;164171}
···11/*22 * Common code for Palm LD, T5, TX, Z7233 *44- * Copyright (C) 201055- * Marek Vasut <marek.vasut@gmail.com>44+ * Copyright (C) 2010-2011 Marek Vasut <marek.vasut@gmail.com>65 *76 * This program is free software; you can redistribute it and/or modify87 * it under the terms of the GNU General Public License version 2 as···157158 palm27x_lcd_screen.pxafb_lcd_power = palm27x_lcd_ctl;158159 }159160160160- set_pxa_fb_info(&palm27x_lcd_screen);161161+ pxa_set_fb_info(NULL, &palm27x_lcd_screen);161162}162163#endif163164
···445445 if (ret)446446 pr_warning("poodle: Unable to register LoCoMo device\n");447447448448- set_pxa_fb_parent(&poodle_locomo_device.dev);449449- set_pxa_fb_info(&poodle_fb_info);448448+ pxa_set_fb_info(&poodle_locomo_device.dev, &poodle_fb_info);450449 pxa_set_udc_info(&udc_info);451450 pxa_set_mci_info(&poodle_mci_platform_data);452451 pxa_set_ficp_info(&poodle_ficp_platform_data);
+1-1
arch/arm/mach-pxa/raumfeld.c
···597597{598598 int ret;599599600600- set_pxa_fb_info(&raumfeld_sharp_lcd_info);600600+ pxa_set_fb_info(NULL, &raumfeld_sharp_lcd_info);601601602602 /* Earlier devices had the backlight regulator controlled603603 * via PWM, later versions use another controller for that */
···516516 pxa_set_stuart_info(NULL);517517518518 if (0) /* dont know how to determine LCD */519519- set_pxa_fb_info(&sharp_lcd);519519+ pxa_set_fb_info(NULL, &sharp_lcd);520520 else521521- set_pxa_fb_info(&toshiba_lcd);521521+ pxa_set_fb_info(NULL, &toshiba_lcd);522522523523 pxa_set_mci_info(&trizeps4_mci_platform_data);524524#ifndef STATUS_LEDS_ON_STUART_PINS
+1-1
arch/arm/mach-pxa/viper.c
···932932 /* Wake-up serial console */933933 viper_init_serial_gpio();934934935935- set_pxa_fb_info(&fb_info);935935+ pxa_set_fb_info(NULL, &fb_info);936936937937 /* v1 hardware cannot use the datacs line */938938 version = viper_hw_version();
···33333434#define DRV_NAME "pata_palmld"35353636+static struct gpio palmld_hdd_gpios[] = {3737+ { GPIO_NR_PALMLD_IDE_PWEN, GPIOF_INIT_HIGH, "HDD Power" },3838+ { GPIO_NR_PALMLD_IDE_RESET, GPIOF_INIT_LOW, "HDD Reset" },3939+};4040+3641static struct scsi_host_template palmld_sht = {3742 ATA_PIO_SHT(DRV_NAME),3843};···57525853 /* allocate host */5954 host = ata_host_alloc(&pdev->dev, 1);6060- if (!host)6161- return -ENOMEM;5555+ if (!host) {5656+ ret = -ENOMEM;5757+ goto err1;5858+ }62596360 /* remap drive's physical memory address */6461 mem = devm_ioremap(&pdev->dev, PALMLD_IDE_PHYS, 0x1000);6565- if (!mem)6666- return -ENOMEM;6262+ if (!mem) {6363+ ret = -ENOMEM;6464+ goto err1;6565+ }67666867 /* request and activate power GPIO, IRQ GPIO */6969- ret = gpio_request(GPIO_NR_PALMLD_IDE_PWEN, "HDD PWR");6868+ ret = gpio_request_array(palmld_hdd_gpios,6969+ ARRAY_SIZE(palmld_hdd_gpios));7070 if (ret)7171 goto err1;7272- ret = gpio_direction_output(GPIO_NR_PALMLD_IDE_PWEN, 1);7373- if (ret)7474- goto err2;7575-7676- ret = gpio_request(GPIO_NR_PALMLD_IDE_RESET, "HDD RST");7777- if (ret)7878- goto err2;7979- ret = gpio_direction_output(GPIO_NR_PALMLD_IDE_RESET, 0);8080- if (ret)8181- goto err3;82728373 /* reset the drive */8474 gpio_set_value(GPIO_NR_PALMLD_IDE_RESET, 0);···9696 ata_sff_std_ports(&ap->ioaddr);97979898 /* activate host */9999- return ata_host_activate(host, 0, NULL, IRQF_TRIGGER_RISING,9999+ ret = ata_host_activate(host, 0, NULL, IRQF_TRIGGER_RISING,100100 &palmld_sht);101101+ if (ret)102102+ goto err2;101103102102-err3:103103- gpio_free(GPIO_NR_PALMLD_IDE_RESET);104104+ return ret;105105+104106err2:105105- gpio_free(GPIO_NR_PALMLD_IDE_PWEN);107107+ gpio_free_array(palmld_hdd_gpios, ARRAY_SIZE(palmld_hdd_gpios));106108err1:107109 return ret;108110}···118116 /* power down the HDD */119117 gpio_set_value(GPIO_NR_PALMLD_IDE_PWEN, 0);120118121121- gpio_free(GPIO_NR_PALMLD_IDE_RESET);122122- gpio_free(GPIO_NR_PALMLD_IDE_PWEN);119119+ gpio_free_array(palmld_hdd_gpios, ARRAY_SIZE(palmld_hdd_gpios));123120124121 return 0;125122}
+50-85
drivers/pcmcia/pxa2xx_colibri.c
···3434#define COLIBRI320_DETECT_GPIO 813535#define COLIBRI320_READY_GPIO 2936363737-static struct {3838- int reset_gpio;3939- int ppen_gpio;4040- int bvd1_gpio;4141- int bvd2_gpio;4242- int detect_gpio;4343- int ready_gpio;4444-} colibri_pcmcia_gpio;3737+enum {3838+ DETECT = 0,3939+ READY = 1,4040+ BVD1 = 2,4141+ BVD2 = 3,4242+ PPEN = 4,4343+ RESET = 5,4444+};4545+4646+/* Contents of this array are configured on-the-fly in init function */4747+static struct gpio colibri_pcmcia_gpios[] = {4848+ { 0, GPIOF_IN, "PCMCIA Detect" },4949+ { 0, GPIOF_IN, "PCMCIA Ready" },5050+ { 0, GPIOF_IN, "PCMCIA BVD1" },5151+ { 0, GPIOF_IN, "PCMCIA BVD2" },5252+ { 0, GPIOF_INIT_LOW, "PCMCIA PPEN" },5353+ { 0, GPIOF_INIT_HIGH,"PCMCIA Reset" },5454+};45554656static struct pcmcia_irqs colibri_irqs[] = {4757 {···6454{6555 int ret;66566767- ret = gpio_request(colibri_pcmcia_gpio.detect_gpio, "DETECT");5757+ ret = gpio_request_array(colibri_pcmcia_gpios,5858+ ARRAY_SIZE(colibri_pcmcia_gpios));6859 if (ret)6960 goto err1;7070- ret = gpio_direction_input(colibri_pcmcia_gpio.detect_gpio);7171- if (ret)7272- goto err2;73617474- ret = gpio_request(colibri_pcmcia_gpio.ready_gpio, "READY");7575- if (ret)7676- goto err2;7777- ret = gpio_direction_input(colibri_pcmcia_gpio.ready_gpio);7878- if (ret)7979- goto err3;6262+ colibri_irqs[0].irq = gpio_to_irq(colibri_pcmcia_gpios[DETECT].gpio);6363+ skt->socket.pci_irq = gpio_to_irq(colibri_pcmcia_gpios[READY].gpio);80648181- ret = gpio_request(colibri_pcmcia_gpio.bvd1_gpio, "BVD1");8282- if (ret)8383- goto err3;8484- ret = gpio_direction_input(colibri_pcmcia_gpio.bvd1_gpio);8585- if (ret)8686- goto err4;8787-8888- ret = gpio_request(colibri_pcmcia_gpio.bvd2_gpio, "BVD2");8989- if (ret)9090- goto err4;9191- ret = gpio_direction_input(colibri_pcmcia_gpio.bvd2_gpio);9292- if (ret)9393- goto err5;9494-9595- ret = gpio_request(colibri_pcmcia_gpio.ppen_gpio, "PPEN");9696- if (ret)9797- goto err5;9898- ret = gpio_direction_output(colibri_pcmcia_gpio.ppen_gpio, 0);9999- if (ret)100100- goto err6;101101-102102- ret = gpio_request(colibri_pcmcia_gpio.reset_gpio, "RESET");103103- if (ret)104104- goto err6;105105- ret = gpio_direction_output(colibri_pcmcia_gpio.reset_gpio, 1);106106- if (ret)107107- goto err7;108108-109109- colibri_irqs[0].irq = gpio_to_irq(colibri_pcmcia_gpio.detect_gpio);110110- skt->socket.pci_irq = gpio_to_irq(colibri_pcmcia_gpio.ready_gpio);111111-112112- return soc_pcmcia_request_irqs(skt, colibri_irqs,6565+ ret = soc_pcmcia_request_irqs(skt, colibri_irqs,11366 ARRAY_SIZE(colibri_irqs));6767+ if (ret)6868+ goto err2;11469115115-err7:116116- gpio_free(colibri_pcmcia_gpio.detect_gpio);117117-err6:118118- gpio_free(colibri_pcmcia_gpio.ready_gpio);119119-err5:120120- gpio_free(colibri_pcmcia_gpio.bvd1_gpio);121121-err4:122122- gpio_free(colibri_pcmcia_gpio.bvd2_gpio);123123-err3:124124- gpio_free(colibri_pcmcia_gpio.reset_gpio);7070+ return ret;7171+12572err2:126126- gpio_free(colibri_pcmcia_gpio.ppen_gpio);7373+ gpio_free_array(colibri_pcmcia_gpios,7474+ ARRAY_SIZE(colibri_pcmcia_gpios));12775err1:12876 return ret;12977}1307813179static void colibri_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)13280{133133- gpio_free(colibri_pcmcia_gpio.detect_gpio);134134- gpio_free(colibri_pcmcia_gpio.ready_gpio);135135- gpio_free(colibri_pcmcia_gpio.bvd1_gpio);136136- gpio_free(colibri_pcmcia_gpio.bvd2_gpio);137137- gpio_free(colibri_pcmcia_gpio.reset_gpio);138138- gpio_free(colibri_pcmcia_gpio.ppen_gpio);8181+ gpio_free_array(colibri_pcmcia_gpios,8282+ ARRAY_SIZE(colibri_pcmcia_gpios));13983}1408414185static void colibri_pcmcia_socket_state(struct soc_pcmcia_socket *skt,14286 struct pcmcia_state *state)14387{14488145145- state->detect = !!gpio_get_value(colibri_pcmcia_gpio.detect_gpio);146146- state->ready = !!gpio_get_value(colibri_pcmcia_gpio.ready_gpio);147147- state->bvd1 = !!gpio_get_value(colibri_pcmcia_gpio.bvd1_gpio);148148- state->bvd2 = !!gpio_get_value(colibri_pcmcia_gpio.bvd2_gpio);8989+ state->detect = !!gpio_get_value(colibri_pcmcia_gpios[DETECT].gpio);9090+ state->ready = !!gpio_get_value(colibri_pcmcia_gpios[READY].gpio);9191+ state->bvd1 = !!gpio_get_value(colibri_pcmcia_gpios[BVD1].gpio);9292+ state->bvd2 = !!gpio_get_value(colibri_pcmcia_gpios[BVD2].gpio);14993 state->wrprot = 0;15094 state->vs_3v = 1;15195 state->vs_Xv = 0;···109145colibri_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,110146 const socket_state_t *state)111147{112112- gpio_set_value(colibri_pcmcia_gpio.ppen_gpio,148148+ gpio_set_value(colibri_pcmcia_gpios[PPEN].gpio,113149 !(state->Vcc == 33 && state->Vpp < 50));114114- gpio_set_value(colibri_pcmcia_gpio.reset_gpio, state->flags & SS_RESET);150150+ gpio_set_value(colibri_pcmcia_gpios[RESET].gpio,151151+ state->flags & SS_RESET);115152 return 0;116153}117154···155190156191 /* Colibri PXA270 */157192 if (machine_is_colibri()) {158158- colibri_pcmcia_gpio.reset_gpio = COLIBRI270_RESET_GPIO;159159- colibri_pcmcia_gpio.ppen_gpio = COLIBRI270_PPEN_GPIO;160160- colibri_pcmcia_gpio.bvd1_gpio = COLIBRI270_BVD1_GPIO;161161- colibri_pcmcia_gpio.bvd2_gpio = COLIBRI270_BVD2_GPIO;162162- colibri_pcmcia_gpio.detect_gpio = COLIBRI270_DETECT_GPIO;163163- colibri_pcmcia_gpio.ready_gpio = COLIBRI270_READY_GPIO;193193+ colibri_pcmcia_gpios[RESET].gpio = COLIBRI270_RESET_GPIO;194194+ colibri_pcmcia_gpios[PPEN].gpio = COLIBRI270_PPEN_GPIO;195195+ colibri_pcmcia_gpios[BVD1].gpio = COLIBRI270_BVD1_GPIO;196196+ colibri_pcmcia_gpios[BVD2].gpio = COLIBRI270_BVD2_GPIO;197197+ colibri_pcmcia_gpios[DETECT].gpio = COLIBRI270_DETECT_GPIO;198198+ colibri_pcmcia_gpios[READY].gpio = COLIBRI270_READY_GPIO;164199 /* Colibri PXA320 */165200 } else if (machine_is_colibri320()) {166166- colibri_pcmcia_gpio.reset_gpio = COLIBRI320_RESET_GPIO;167167- colibri_pcmcia_gpio.ppen_gpio = COLIBRI320_PPEN_GPIO;168168- colibri_pcmcia_gpio.bvd1_gpio = COLIBRI320_BVD1_GPIO;169169- colibri_pcmcia_gpio.bvd2_gpio = COLIBRI320_BVD2_GPIO;170170- colibri_pcmcia_gpio.detect_gpio = COLIBRI320_DETECT_GPIO;171171- colibri_pcmcia_gpio.ready_gpio = COLIBRI320_READY_GPIO;201201+ colibri_pcmcia_gpios[RESET].gpio = COLIBRI320_RESET_GPIO;202202+ colibri_pcmcia_gpios[PPEN].gpio = COLIBRI320_PPEN_GPIO;203203+ colibri_pcmcia_gpios[BVD1].gpio = COLIBRI320_BVD1_GPIO;204204+ colibri_pcmcia_gpios[BVD2].gpio = COLIBRI320_BVD2_GPIO;205205+ colibri_pcmcia_gpios[DETECT].gpio = COLIBRI320_DETECT_GPIO;206206+ colibri_pcmcia_gpios[READY].gpio = COLIBRI320_READY_GPIO;172207 }173208174209 ret = platform_device_add_data(colibri_pcmcia_device,
+10-32
drivers/pcmcia/pxa2xx_palmld.c
···44 * Driver for Palm LifeDrive PCMCIA55 *66 * Copyright (C) 2006 Alex Osborne <ato@meshy.org>77- * Copyright (C) 2007-2008 Marek Vasut <marek.vasut@gmail.com>77+ * Copyright (C) 2007-2011 Marek Vasut <marek.vasut@gmail.com>88 *99 * This program is free software; you can redistribute it and/or modify1010 * it under the terms of the GNU General Public License version 2 as···2020#include <mach/palmld.h>2121#include "soc_common.h"22222323+static struct gpio palmld_pcmcia_gpios[] = {2424+ { GPIO_NR_PALMLD_PCMCIA_POWER, GPIOF_INIT_LOW, "PCMCIA Power" },2525+ { GPIO_NR_PALMLD_PCMCIA_RESET, GPIOF_INIT_HIGH,"PCMCIA Reset" },2626+ { GPIO_NR_PALMLD_PCMCIA_READY, GPIOF_IN, "PCMCIA Ready" },2727+};2828+2329static int palmld_pcmcia_hw_init(struct soc_pcmcia_socket *skt)2430{2531 int ret;26322727- ret = gpio_request(GPIO_NR_PALMLD_PCMCIA_POWER, "PCMCIA PWR");2828- if (ret)2929- goto err1;3030- ret = gpio_direction_output(GPIO_NR_PALMLD_PCMCIA_POWER, 0);3131- if (ret)3232- goto err2;3333-3434- ret = gpio_request(GPIO_NR_PALMLD_PCMCIA_RESET, "PCMCIA RST");3535- if (ret)3636- goto err2;3737- ret = gpio_direction_output(GPIO_NR_PALMLD_PCMCIA_RESET, 1);3838- if (ret)3939- goto err3;4040-4141- ret = gpio_request(GPIO_NR_PALMLD_PCMCIA_READY, "PCMCIA RDY");4242- if (ret)4343- goto err3;4444- ret = gpio_direction_input(GPIO_NR_PALMLD_PCMCIA_READY);4545- if (ret)4646- goto err4;3333+ ret = gpio_request_array(palmld_pcmcia_gpios,3434+ ARRAY_SIZE(palmld_pcmcia_gpios));47354836 skt->socket.pci_irq = IRQ_GPIO(GPIO_NR_PALMLD_PCMCIA_READY);4949- return 0;50375151-err4:5252- gpio_free(GPIO_NR_PALMLD_PCMCIA_READY);5353-err3:5454- gpio_free(GPIO_NR_PALMLD_PCMCIA_RESET);5555-err2:5656- gpio_free(GPIO_NR_PALMLD_PCMCIA_POWER);5757-err1:5838 return ret;5939}60406141static void palmld_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)6242{6363- gpio_free(GPIO_NR_PALMLD_PCMCIA_READY);6464- gpio_free(GPIO_NR_PALMLD_PCMCIA_RESET);6565- gpio_free(GPIO_NR_PALMLD_PCMCIA_POWER);4343+ gpio_free_array(palmld_pcmcia_gpios, ARRAY_SIZE(palmld_pcmcia_gpios));6644}67456846static void palmld_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
+13-62
drivers/pcmcia/pxa2xx_palmtc.c
···44 * Driver for Palm Tungsten|C PCMCIA55 *66 * Copyright (C) 2008 Alex Osborne <ato@meshy.org>77- * Copyright (C) 2009 Marek Vasut <marek.vasut@gmail.com>77+ * Copyright (C) 2009-2011 Marek Vasut <marek.vasut@gmail.com>88 *99 * This program is free software; you can redistribute it and/or modify1010 * it under the terms of the GNU General Public License version 2 as···2121#include <mach/palmtc.h>2222#include "soc_common.h"23232424+static struct gpio palmtc_pcmcia_gpios[] = {2525+ { GPIO_NR_PALMTC_PCMCIA_POWER1, GPIOF_INIT_LOW, "PCMCIA Power 1" },2626+ { GPIO_NR_PALMTC_PCMCIA_POWER2, GPIOF_INIT_LOW, "PCMCIA Power 2" },2727+ { GPIO_NR_PALMTC_PCMCIA_POWER3, GPIOF_INIT_LOW, "PCMCIA Power 3" },2828+ { GPIO_NR_PALMTC_PCMCIA_RESET, GPIOF_INIT_HIGH,"PCMCIA Reset" },2929+ { GPIO_NR_PALMTC_PCMCIA_READY, GPIOF_IN, "PCMCIA Ready" },3030+ { GPIO_NR_PALMTC_PCMCIA_PWRREADY, GPIOF_IN, "PCMCIA Power Ready" },3131+};3232+2433static int palmtc_pcmcia_hw_init(struct soc_pcmcia_socket *skt)2534{2635 int ret;27362828- ret = gpio_request(GPIO_NR_PALMTC_PCMCIA_POWER1, "PCMCIA PWR1");2929- if (ret)3030- goto err1;3131- ret = gpio_direction_output(GPIO_NR_PALMTC_PCMCIA_POWER1, 0);3232- if (ret)3333- goto err2;3434-3535- ret = gpio_request(GPIO_NR_PALMTC_PCMCIA_POWER2, "PCMCIA PWR2");3636- if (ret)3737- goto err2;3838- ret = gpio_direction_output(GPIO_NR_PALMTC_PCMCIA_POWER2, 0);3939- if (ret)4040- goto err3;4141-4242- ret = gpio_request(GPIO_NR_PALMTC_PCMCIA_POWER3, "PCMCIA PWR3");4343- if (ret)4444- goto err3;4545- ret = gpio_direction_output(GPIO_NR_PALMTC_PCMCIA_POWER3, 0);4646- if (ret)4747- goto err4;4848-4949- ret = gpio_request(GPIO_NR_PALMTC_PCMCIA_RESET, "PCMCIA RST");5050- if (ret)5151- goto err4;5252- ret = gpio_direction_output(GPIO_NR_PALMTC_PCMCIA_RESET, 1);5353- if (ret)5454- goto err5;5555-5656- ret = gpio_request(GPIO_NR_PALMTC_PCMCIA_READY, "PCMCIA RDY");5757- if (ret)5858- goto err5;5959- ret = gpio_direction_input(GPIO_NR_PALMTC_PCMCIA_READY);6060- if (ret)6161- goto err6;6262-6363- ret = gpio_request(GPIO_NR_PALMTC_PCMCIA_PWRREADY, "PCMCIA PWRRDY");6464- if (ret)6565- goto err6;6666- ret = gpio_direction_input(GPIO_NR_PALMTC_PCMCIA_PWRREADY);6767- if (ret)6868- goto err7;3737+ ret = gpio_request_array(palmtc_pcmcia_gpios,3838+ ARRAY_SIZE(palmtc_pcmcia_gpios));69397040 skt->socket.pci_irq = IRQ_GPIO(GPIO_NR_PALMTC_PCMCIA_READY);7171- return 0;72417373-err7:7474- gpio_free(GPIO_NR_PALMTC_PCMCIA_PWRREADY);7575-err6:7676- gpio_free(GPIO_NR_PALMTC_PCMCIA_READY);7777-err5:7878- gpio_free(GPIO_NR_PALMTC_PCMCIA_RESET);7979-err4:8080- gpio_free(GPIO_NR_PALMTC_PCMCIA_POWER3);8181-err3:8282- gpio_free(GPIO_NR_PALMTC_PCMCIA_POWER2);8383-err2:8484- gpio_free(GPIO_NR_PALMTC_PCMCIA_POWER1);8585-err1:8642 return ret;8743}88448945static void palmtc_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)9046{9191- gpio_free(GPIO_NR_PALMTC_PCMCIA_PWRREADY);9292- gpio_free(GPIO_NR_PALMTC_PCMCIA_READY);9393- gpio_free(GPIO_NR_PALMTC_PCMCIA_RESET);9494- gpio_free(GPIO_NR_PALMTC_PCMCIA_POWER3);9595- gpio_free(GPIO_NR_PALMTC_PCMCIA_POWER2);9696- gpio_free(GPIO_NR_PALMTC_PCMCIA_POWER1);4747+ gpio_free_array(palmtc_pcmcia_gpios, ARRAY_SIZE(palmtc_pcmcia_gpios));9748}98499950static void palmtc_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
+12-45
drivers/pcmcia/pxa2xx_palmtx.c
···33 *44 * Driver for Palm T|X PCMCIA55 *66- * Copyright (C) 2007-2008 Marek Vasut <marek.vasut@gmail.com>66+ * Copyright (C) 2007-2011 Marek Vasut <marek.vasut@gmail.com>77 *88 * This program is free software; you can redistribute it and/or modify99 * it under the terms of the GNU General Public License version 2 as···13131414#include <linux/module.h>1515#include <linux/platform_device.h>1616+#include <linux/gpio.h>16171718#include <asm/mach-types.h>1818-1919-#include <mach/gpio.h>2019#include <mach/palmtx.h>2121-2220#include "soc_common.h"2121+2222+static struct gpio palmtx_pcmcia_gpios[] = {2323+ { GPIO_NR_PALMTX_PCMCIA_POWER1, GPIOF_INIT_LOW, "PCMCIA Power 1" },2424+ { GPIO_NR_PALMTX_PCMCIA_POWER2, GPIOF_INIT_LOW, "PCMCIA Power 2" },2525+ { GPIO_NR_PALMTX_PCMCIA_RESET, GPIOF_INIT_HIGH,"PCMCIA Reset" },2626+ { GPIO_NR_PALMTX_PCMCIA_READY, GPIOF_IN, "PCMCIA Ready" },2727+};23282429static int palmtx_pcmcia_hw_init(struct soc_pcmcia_socket *skt)2530{2631 int ret;27322828- ret = gpio_request(GPIO_NR_PALMTX_PCMCIA_POWER1, "PCMCIA PWR1");2929- if (ret)3030- goto err1;3131- ret = gpio_direction_output(GPIO_NR_PALMTX_PCMCIA_POWER1, 0);3232- if (ret)3333- goto err2;3434-3535- ret = gpio_request(GPIO_NR_PALMTX_PCMCIA_POWER2, "PCMCIA PWR2");3636- if (ret)3737- goto err2;3838- ret = gpio_direction_output(GPIO_NR_PALMTX_PCMCIA_POWER2, 0);3939- if (ret)4040- goto err3;4141-4242- ret = gpio_request(GPIO_NR_PALMTX_PCMCIA_RESET, "PCMCIA RST");4343- if (ret)4444- goto err3;4545- ret = gpio_direction_output(GPIO_NR_PALMTX_PCMCIA_RESET, 1);4646- if (ret)4747- goto err4;4848-4949- ret = gpio_request(GPIO_NR_PALMTX_PCMCIA_READY, "PCMCIA RDY");5050- if (ret)5151- goto err4;5252- ret = gpio_direction_input(GPIO_NR_PALMTX_PCMCIA_READY);5353- if (ret)5454- goto err5;3333+ ret = gpio_request_array(palmtx_pcmcia_gpios,3434+ ARRAY_SIZE(palmtx_pcmcia_gpios));55355636 skt->socket.pci_irq = gpio_to_irq(GPIO_NR_PALMTX_PCMCIA_READY);5757- return 0;58375959-err5:6060- gpio_free(GPIO_NR_PALMTX_PCMCIA_READY);6161-err4:6262- gpio_free(GPIO_NR_PALMTX_PCMCIA_RESET);6363-err3:6464- gpio_free(GPIO_NR_PALMTX_PCMCIA_POWER2);6565-err2:6666- gpio_free(GPIO_NR_PALMTX_PCMCIA_POWER1);6767-err1:6838 return ret;6939}70407141static void palmtx_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)7242{7373- gpio_free(GPIO_NR_PALMTX_PCMCIA_READY);7474- gpio_free(GPIO_NR_PALMTX_PCMCIA_RESET);7575- gpio_free(GPIO_NR_PALMTX_PCMCIA_POWER2);7676- gpio_free(GPIO_NR_PALMTX_PCMCIA_POWER1);4343+ gpio_free_array(palmtx_pcmcia_gpios, ARRAY_SIZE(palmtx_pcmcia_gpios));7744}78457946static void palmtx_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
+30-80
drivers/pcmcia/pxa2xx_vpac270.c
···33 *44 * Driver for Voipac PXA270 PCMCIA and CF sockets55 *66- * Copyright (C) 201077- * Marek Vasut <marek.vasut@gmail.com>66+ * Copyright (C) 2010-2011 Marek Vasut <marek.vasut@gmail.com>87 *98 * This program is free software; you can redistribute it and/or modify109 * it under the terms of the GNU General Public License version 2 as···2021#include <mach/vpac270.h>21222223#include "soc_common.h"2424+2525+static struct gpio vpac270_pcmcia_gpios[] = {2626+ { GPIO84_VPAC270_PCMCIA_CD, GPIOF_IN, "PCMCIA Card Detect" },2727+ { GPIO35_VPAC270_PCMCIA_RDY, GPIOF_IN, "PCMCIA Ready" },2828+ { GPIO107_VPAC270_PCMCIA_PPEN, GPIOF_INIT_LOW, "PCMCIA PPEN" },2929+ { GPIO11_VPAC270_PCMCIA_RESET, GPIOF_INIT_LOW, "PCMCIA Reset" },3030+};3131+3232+static struct gpio vpac270_cf_gpios[] = {3333+ { GPIO17_VPAC270_CF_CD, GPIOF_IN, "CF Card Detect" },3434+ { GPIO12_VPAC270_CF_RDY, GPIOF_IN, "CF Ready" },3535+ { GPIO16_VPAC270_CF_RESET, GPIOF_INIT_LOW, "CF Reset" },3636+};23372438static struct pcmcia_irqs cd_irqs[] = {2539 {···5240 int ret;53415442 if (skt->nr == 0) {5555- ret = gpio_request(GPIO84_VPAC270_PCMCIA_CD, "PCMCIA CD");5656- if (ret)5757- goto err1;5858- ret = gpio_direction_input(GPIO84_VPAC270_PCMCIA_CD);5959- if (ret)6060- goto err2;6161-6262- ret = gpio_request(GPIO35_VPAC270_PCMCIA_RDY, "PCMCIA RDY");6363- if (ret)6464- goto err2;6565- ret = gpio_direction_input(GPIO35_VPAC270_PCMCIA_RDY);6666- if (ret)6767- goto err3;6868-6969- ret = gpio_request(GPIO107_VPAC270_PCMCIA_PPEN, "PCMCIA PPEN");7070- if (ret)7171- goto err3;7272- ret = gpio_direction_output(GPIO107_VPAC270_PCMCIA_PPEN, 0);7373- if (ret)7474- goto err4;7575-7676- ret = gpio_request(GPIO11_VPAC270_PCMCIA_RESET, "PCMCIA RESET");7777- if (ret)7878- goto err4;7979- ret = gpio_direction_output(GPIO11_VPAC270_PCMCIA_RESET, 0);8080- if (ret)8181- goto err5;4343+ ret = gpio_request_array(vpac270_pcmcia_gpios,4444+ ARRAY_SIZE(vpac270_pcmcia_gpios));82458346 skt->socket.pci_irq = gpio_to_irq(GPIO35_VPAC270_PCMCIA_RDY);84478585- return soc_pcmcia_request_irqs(skt, &cd_irqs[0], 1);8686-8787-err5:8888- gpio_free(GPIO11_VPAC270_PCMCIA_RESET);8989-err4:9090- gpio_free(GPIO107_VPAC270_PCMCIA_PPEN);9191-err3:9292- gpio_free(GPIO35_VPAC270_PCMCIA_RDY);9393-err2:9494- gpio_free(GPIO84_VPAC270_PCMCIA_CD);9595-err1:9696- return ret;9797-4848+ if (!ret)4949+ ret = soc_pcmcia_request_irqs(skt, &cd_irqs[0], 1);9850 } else {9999- ret = gpio_request(GPIO17_VPAC270_CF_CD, "CF CD");100100- if (ret)101101- goto err6;102102- ret = gpio_direction_input(GPIO17_VPAC270_CF_CD);103103- if (ret)104104- goto err7;105105-106106- ret = gpio_request(GPIO12_VPAC270_CF_RDY, "CF RDY");107107- if (ret)108108- goto err7;109109- ret = gpio_direction_input(GPIO12_VPAC270_CF_RDY);110110- if (ret)111111- goto err8;112112-113113- ret = gpio_request(GPIO16_VPAC270_CF_RESET, "CF RESET");114114- if (ret)115115- goto err8;116116- ret = gpio_direction_output(GPIO16_VPAC270_CF_RESET, 0);117117- if (ret)118118- goto err9;5151+ ret = gpio_request_array(vpac270_cf_gpios,5252+ ARRAY_SIZE(vpac270_cf_gpios));1195312054 skt->socket.pci_irq = gpio_to_irq(GPIO12_VPAC270_CF_RDY);12155122122- return soc_pcmcia_request_irqs(skt, &cd_irqs[1], 1);123123-124124-err9:125125- gpio_free(GPIO16_VPAC270_CF_RESET);126126-err8:127127- gpio_free(GPIO12_VPAC270_CF_RDY);128128-err7:129129- gpio_free(GPIO17_VPAC270_CF_CD);130130-err6:131131- return ret;132132-5656+ if (!ret)5757+ ret = soc_pcmcia_request_irqs(skt, &cd_irqs[1], 1);13358 }5959+6060+ return ret;13461}1356213663static void vpac270_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)13764{138138- gpio_free(GPIO11_VPAC270_PCMCIA_RESET);139139- gpio_free(GPIO107_VPAC270_PCMCIA_PPEN);140140- gpio_free(GPIO35_VPAC270_PCMCIA_RDY);141141- gpio_free(GPIO84_VPAC270_PCMCIA_CD);142142- gpio_free(GPIO16_VPAC270_CF_RESET);143143- gpio_free(GPIO12_VPAC270_CF_RDY);144144- gpio_free(GPIO17_VPAC270_CF_CD);6565+ if (skt->nr == 0)6666+ gpio_request_array(vpac270_pcmcia_gpios,6767+ ARRAY_SIZE(vpac270_pcmcia_gpios));6868+ else6969+ gpio_request_array(vpac270_cf_gpios,7070+ ARRAY_SIZE(vpac270_cf_gpios));14571}1467214773static void vpac270_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
+7-69
drivers/usb/gadget/pxa25x_udc.c
···139139static void pxa25x_ep_fifo_flush (struct usb_ep *ep);140140static void nuke (struct pxa25x_ep *, int status);141141142142-/* one GPIO should be used to detect VBUS from the host */143143-static int is_vbus_present(void)144144-{145145- struct pxa2xx_udc_mach_info *mach = the_controller->mach;146146-147147- if (gpio_is_valid(mach->gpio_vbus)) {148148- int value = gpio_get_value(mach->gpio_vbus);149149-150150- if (mach->gpio_vbus_inverted)151151- return !value;152152- else153153- return !!value;154154- }155155- if (mach->udc_is_connected)156156- return mach->udc_is_connected();157157- return 1;158158-}159159-160142/* one GPIO should control a D+ pullup, so host sees this device (or not) */161143static void pullup_off(void)162144{···10371055 "%s version: %s\nGadget driver: %s\nHost %s\n\n",10381056 driver_name, DRIVER_VERSION SIZE_STR "(pio)",10391057 dev->driver ? dev->driver->driver.name : "(none)",10401040- is_vbus_present() ? "full speed" : "disconnected");10581058+ dev->gadget.speed == USB_SPEED_FULL ? "full speed" : "disconnected");1041105910421060 /* registers for device and ep0 */10431061 seq_printf(m,···10761094 (tmp & UDCCFR_ACM) ? " acm" : "");10771095 }1078109610791079- if (!is_vbus_present() || !dev->driver)10971097+ if (dev->gadget.speed != USB_SPEED_FULL || !dev->driver)10801098 goto done;1081109910821100 seq_printf(m, "ep0 IN %lu/%lu, OUT %lu/%lu\nirqs %lu\n\n",···1417143514181436#endif1419143714201420-static irqreturn_t udc_vbus_irq(int irq, void *_dev)14211421-{14221422- struct pxa25x_udc *dev = _dev;14231423-14241424- pxa25x_udc_vbus_session(&dev->gadget, is_vbus_present());14251425- return IRQ_HANDLED;14261426-}14271427-1428143814291439/*-------------------------------------------------------------------------*/14301440···17401766 if (unlikely(udccr & UDCCR_SUSIR)) {17411767 udc_ack_int_UDCCR(UDCCR_SUSIR);17421768 handled = 1;17431743- DBG(DBG_VERBOSE, "USB suspend%s\n", is_vbus_present()17441744- ? "" : "+disconnect");17691769+ DBG(DBG_VERBOSE, "USB suspend\n");1745177017461746- if (!is_vbus_present())17471747- stop_activity(dev, dev->driver);17481748- else if (dev->gadget.speed != USB_SPEED_UNKNOWN17711771+ if (dev->gadget.speed != USB_SPEED_UNKNOWN17491772 && dev->driver17501773 && dev->driver->suspend)17511774 dev->driver->suspend(&dev->gadget);···1757178617581787 if (dev->gadget.speed != USB_SPEED_UNKNOWN17591788 && dev->driver17601760- && dev->driver->resume17611761- && is_vbus_present())17891789+ && dev->driver->resume)17621790 dev->driver->resume(&dev->gadget);17631791 }17641792···21072137static int __init pxa25x_udc_probe(struct platform_device *pdev)21082138{21092139 struct pxa25x_udc *dev = &memory;21102110- int retval, vbus_irq, irq;21402140+ int retval, irq;21112141 u32 chiprev;2112214221132143 /* insist on Intel/ARM/XScale */···2169219921702200 dev->transceiver = otg_get_transceiver();2171220121722172- if (gpio_is_valid(dev->mach->gpio_vbus)) {21732173- if ((retval = gpio_request(dev->mach->gpio_vbus,21742174- "pxa25x_udc GPIO VBUS"))) {21752175- dev_dbg(&pdev->dev,21762176- "can't get vbus gpio %d, err: %d\n",21772177- dev->mach->gpio_vbus, retval);21782178- goto err_gpio_vbus;21792179- }21802180- gpio_direction_input(dev->mach->gpio_vbus);21812181- vbus_irq = gpio_to_irq(dev->mach->gpio_vbus);21822182- } else21832183- vbus_irq = 0;21842184-21852202 if (gpio_is_valid(dev->mach->gpio_pullup)) {21862203 if ((retval = gpio_request(dev->mach->gpio_pullup,21872204 "pca25x_udc GPIO PULLUP"))) {···21942237 udc_disable(dev);21952238 udc_reinit(dev);2196223921972197- dev->vbus = !!is_vbus_present();22402240+ dev->vbus = 0;2198224121992242 /* irq setup after old hardware state is cleaned up */22002243 retval = request_irq(irq, pxa25x_udc_irq,···22302273 }22312274 } else22322275#endif22332233- if (vbus_irq) {22342234- retval = request_irq(vbus_irq, udc_vbus_irq,22352235- IRQF_DISABLED | IRQF_SAMPLE_RANDOM |22362236- IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,22372237- driver_name, dev);22382238- if (retval != 0) {22392239- pr_err("%s: can't get irq %i, err %d\n",22402240- driver_name, vbus_irq, retval);22412241- goto err_vbus_irq;22422242- }22432243- }22442276 create_debug_files(dev);2245227722462278 return 0;2247227922482248- err_vbus_irq:22492280#ifdef CONFIG_ARCH_LUBBOCK22502281 free_irq(LUBBOCK_USB_DISC_IRQ, dev);22512282 err_irq_lub:···22432298 if (gpio_is_valid(dev->mach->gpio_pullup))22442299 gpio_free(dev->mach->gpio_pullup);22452300 err_gpio_pullup:22462246- if (gpio_is_valid(dev->mach->gpio_vbus))22472247- gpio_free(dev->mach->gpio_vbus);22482248- err_gpio_vbus:22492301 if (dev->transceiver) {22502302 otg_put_transceiver(dev->transceiver);22512303 dev->transceiver = NULL;···22792337 free_irq(LUBBOCK_USB_IRQ, dev);22802338 }22812339#endif22822282- if (gpio_is_valid(dev->mach->gpio_vbus)) {22832283- free_irq(gpio_to_irq(dev->mach->gpio_vbus), dev);22842284- gpio_free(dev->mach->gpio_vbus);22852285- }22862340 if (gpio_is_valid(dev->mach->gpio_pullup))22872341 gpio_free(dev->mach->gpio_pullup);22882342
+89-47
drivers/video/pxafb.c
···627627628628static void overlay1fb_disable(struct pxafb_layer *ofb)629629{630630- uint32_t lccr5 = lcd_readl(ofb->fbi, LCCR5);630630+ uint32_t lccr5;631631+632632+ if (!(lcd_readl(ofb->fbi, OVL1C1) & OVLxC1_OEN))633633+ return;634634+635635+ lccr5 = lcd_readl(ofb->fbi, LCCR5);631636632637 lcd_writel(ofb->fbi, OVL1C1, ofb->control[0] & ~OVLxC1_OEN);633638···690685691686static void overlay2fb_disable(struct pxafb_layer *ofb)692687{693693- uint32_t lccr5 = lcd_readl(ofb->fbi, LCCR5);688688+ uint32_t lccr5;689689+690690+ if (!(lcd_readl(ofb->fbi, OVL2C1) & OVLxC1_OEN))691691+ return;692692+693693+ lccr5 = lcd_readl(ofb->fbi, LCCR5);694694695695 lcd_writel(ofb->fbi, OVL2C1, ofb->control[0] & ~OVLxC1_OEN);696696···730720 if (user == 0)731721 return -ENODEV;732722733733- /* allow only one user at a time */734734- if (atomic_inc_and_test(&ofb->usage))735735- return -EBUSY;723723+ if (ofb->usage++ == 0)724724+ /* unblank the base framebuffer */725725+ fb_blank(&ofb->fbi->fb, FB_BLANK_UNBLANK);736726737737- /* unblank the base framebuffer */738738- fb_blank(&ofb->fbi->fb, FB_BLANK_UNBLANK);739727 return 0;740728}741729···741733{742734 struct pxafb_layer *ofb = (struct pxafb_layer*) info;743735744744- atomic_dec(&ofb->usage);745745- ofb->ops->disable(ofb);736736+ if (ofb->usage == 1) {737737+ ofb->ops->disable(ofb);738738+ ofb->fb.var.height = -1;739739+ ofb->fb.var.width = -1;740740+ ofb->fb.var.xres = ofb->fb.var.xres_virtual = 0;741741+ ofb->fb.var.yres = ofb->fb.var.yres_virtual = 0;746742747747- free_pages_exact(ofb->video_mem, ofb->video_mem_size);748748- ofb->video_mem = NULL;749749- ofb->video_mem_size = 0;743743+ ofb->usage--;744744+ }750745 return 0;751746}752747···761750 int xpos, ypos, pfor, bpp;762751763752 xpos = NONSTD_TO_XPOS(var->nonstd);764764- ypos = NONSTD_TO_XPOS(var->nonstd);753753+ ypos = NONSTD_TO_YPOS(var->nonstd);765754 pfor = NONSTD_TO_PFOR(var->nonstd);766755767756 bpp = pxafb_var_to_bpp(var);···805794 return 0;806795}807796808808-static int overlayfb_map_video_memory(struct pxafb_layer *ofb)797797+static int overlayfb_check_video_memory(struct pxafb_layer *ofb)809798{810799 struct fb_var_screeninfo *var = &ofb->fb.var;811800 int pfor = NONSTD_TO_PFOR(var->nonstd);···823812824813 size = PAGE_ALIGN(ofb->fb.fix.line_length * var->yres_virtual);825814826826- /* don't re-allocate if the original video memory is enough */827815 if (ofb->video_mem) {828816 if (ofb->video_mem_size >= size)829817 return 0;830830-831831- free_pages_exact(ofb->video_mem, ofb->video_mem_size);832818 }833833-834834- ofb->video_mem = alloc_pages_exact(size, GFP_KERNEL | __GFP_ZERO);835835- if (ofb->video_mem == NULL)836836- return -ENOMEM;837837-838838- ofb->video_mem_phys = virt_to_phys(ofb->video_mem);839839- ofb->video_mem_size = size;840840-841841- mutex_lock(&ofb->fb.mm_lock);842842- ofb->fb.fix.smem_start = ofb->video_mem_phys;843843- ofb->fb.fix.smem_len = ofb->fb.fix.line_length * var->yres_virtual;844844- mutex_unlock(&ofb->fb.mm_lock);845845- ofb->fb.screen_base = ofb->video_mem;846846- return 0;819819+ return -EINVAL;847820}848821849822static int overlayfb_set_par(struct fb_info *info)···836841 struct fb_var_screeninfo *var = &info->var;837842 int xpos, ypos, pfor, bpp, ret;838843839839- ret = overlayfb_map_video_memory(ofb);844844+ ret = overlayfb_check_video_memory(ofb);840845 if (ret)841846 return ret;842847843848 bpp = pxafb_var_to_bpp(var);844849 xpos = NONSTD_TO_XPOS(var->nonstd);845845- ypos = NONSTD_TO_XPOS(var->nonstd);850850+ ypos = NONSTD_TO_YPOS(var->nonstd);846851 pfor = NONSTD_TO_PFOR(var->nonstd);847852848853 ofb->control[0] = OVLxC1_PPL(var->xres) | OVLxC1_LPO(var->yres) |···886891887892 ofb->id = id;888893 ofb->ops = &ofb_ops[id];889889- atomic_set(&ofb->usage, 0);894894+ ofb->usage = 0;890895 ofb->fbi = fbi;891896 init_completion(&ofb->branch_done);892897}···899904 return 0;900905}901906902902-static int __devinit pxafb_overlay_init(struct pxafb_info *fbi)907907+static int __devinit pxafb_overlay_map_video_memory(struct pxafb_info *pxafb,908908+ struct pxafb_layer *ofb)909909+{910910+ /* We assume that user will use at most video_mem_size for overlay fb,911911+ * anyway, it's useless to use 16bpp main plane and 24bpp overlay912912+ */913913+ ofb->video_mem = alloc_pages_exact(PAGE_ALIGN(pxafb->video_mem_size),914914+ GFP_KERNEL | __GFP_ZERO);915915+ if (ofb->video_mem == NULL)916916+ return -ENOMEM;917917+918918+ ofb->video_mem_phys = virt_to_phys(ofb->video_mem);919919+ ofb->video_mem_size = PAGE_ALIGN(pxafb->video_mem_size);920920+921921+ mutex_lock(&ofb->fb.mm_lock);922922+ ofb->fb.fix.smem_start = ofb->video_mem_phys;923923+ ofb->fb.fix.smem_len = pxafb->video_mem_size;924924+ mutex_unlock(&ofb->fb.mm_lock);925925+926926+ ofb->fb.screen_base = ofb->video_mem;927927+928928+ return 0;929929+}930930+931931+static void __devinit pxafb_overlay_init(struct pxafb_info *fbi)903932{904933 int i, ret;905934906935 if (!pxafb_overlay_supported())907907- return 0;936936+ return;908937909938 for (i = 0; i < 2; i++) {910910- init_pxafb_overlay(fbi, &fbi->overlay[i], i);911911- ret = register_framebuffer(&fbi->overlay[i].fb);939939+ struct pxafb_layer *ofb = &fbi->overlay[i];940940+ init_pxafb_overlay(fbi, ofb, i);941941+ ret = register_framebuffer(&ofb->fb);912942 if (ret) {913943 dev_err(fbi->dev, "failed to register overlay %d\n", i);914914- return ret;944944+ continue;915945 }946946+ ret = pxafb_overlay_map_video_memory(fbi, ofb);947947+ if (ret) {948948+ dev_err(fbi->dev,949949+ "failed to map video memory for overlay %d\n",950950+ i);951951+ unregister_framebuffer(&ofb->fb);952952+ continue;953953+ }954954+ ofb->registered = 1;916955 }917956918957 /* mask all IU/BS/EOF/SOF interrupts */919958 lcd_writel(fbi, LCCR5, ~0);920959921921- /* place overlay(s) on top of base */922922- fbi->lccr0 |= LCCR0_OUC;923960 pr_info("PXA Overlay driver loaded successfully!\n");924924- return 0;925961}926962927963static void __devexit pxafb_overlay_exit(struct pxafb_info *fbi)···962936 if (!pxafb_overlay_supported())963937 return;964938965965- for (i = 0; i < 2; i++)966966- unregister_framebuffer(&fbi->overlay[i].fb);939939+ for (i = 0; i < 2; i++) {940940+ struct pxafb_layer *ofb = &fbi->overlay[i];941941+ if (ofb->registered) {942942+ if (ofb->video_mem)943943+ free_pages_exact(ofb->video_mem,944944+ ofb->video_mem_size);945945+ unregister_framebuffer(&ofb->fb);946946+ }947947+ }967948}968949#else969950static inline void pxafb_overlay_init(struct pxafb_info *fbi) {}···14011368 (lcd_readl(fbi, LCCR3) != fbi->reg_lccr3) ||14021369 (lcd_readl(fbi, LCCR4) != fbi->reg_lccr4) ||14031370 (lcd_readl(fbi, FDADR0) != fbi->fdadr[0]) ||14041404- (lcd_readl(fbi, FDADR1) != fbi->fdadr[1]))13711371+ ((fbi->lccr0 & LCCR0_SDS) &&13721372+ (lcd_readl(fbi, FDADR1) != fbi->fdadr[1])))14051373 pxafb_schedule_work(fbi, C_REENABLE);1406137414071375 return 0;···14541420 lcd_writel(fbi, LCCR0, fbi->reg_lccr0 & ~LCCR0_ENB);1455142114561422 lcd_writel(fbi, FDADR0, fbi->fdadr[0]);14571457- lcd_writel(fbi, FDADR1, fbi->fdadr[1]);14231423+ if (fbi->lccr0 & LCCR0_SDS)14241424+ lcd_writel(fbi, FDADR1, fbi->fdadr[1]);14581425 lcd_writel(fbi, LCCR0, fbi->reg_lccr0 | LCCR0_ENB);14591426}14601427···1648161316491614 switch (val) {16501615 case CPUFREQ_PRECHANGE:16511651- set_ctrlr_state(fbi, C_DISABLE_CLKCHANGE);16161616+ if (!fbi->overlay[0].usage && !fbi->overlay[1].usage)16171617+ set_ctrlr_state(fbi, C_DISABLE_CLKCHANGE);16521618 break;1653161916541620 case CPUFREQ_POSTCHANGE:···18411805 fbi->task_state = (u_char)-1;1842180618431807 pxafb_decode_mach_info(fbi, inf);18081808+18091809+#ifdef CONFIG_FB_PXA_OVERLAY18101810+ /* place overlay(s) on top of base */18111811+ if (pxafb_overlay_supported())18121812+ fbi->lccr0 |= LCCR0_OUC;18131813+#endif1844181418451815 init_waitqueue_head(&fbi->ctrlr_wait);18461816 INIT_WORK(&fbi->task, pxafb_task);
+2-1
drivers/video/pxafb.h
···9292struct pxafb_layer {9393 struct fb_info fb;9494 int id;9595- atomic_t usage;9595+ int registered;9696+ uint32_t usage;9697 uint32_t control[2];97989899 struct pxafb_layer_ops *ops;