int usb_simtec_init(void) { int ret; printk("USB Power Control, Copyright 2004 Simtec Electronics\n"); ret = gpio_request(S3C2410_GPB(4), "USB power control"); if (ret < 0) { pr_err("%s: failed to get GPB4\n", __func__); return ret; } ret = gpio_request(S3C2410_GPG(10), "USB overcurrent"); if (ret < 0) { pr_err("%s: failed to get GPG10\n", __func__); gpio_free(S3C2410_GPB(4)); return ret; } /* turn power on */ gpio_direction_output(S3C2410_GPB(4), 1); gpio_direction_input(S3C2410_GPG(10)); s3c_ohci_set_platdata(&usb_simtec_info); return 0; }
/** * s3c24xx_ts_cfg_gpio - configure gpio for s3c2410 systems * * Configure the GPIO for the S3C2410 system, where we have external FETs * connected to the device (later systems such as the S3C2440 integrate * these into the device). */ void s3c24xx_ts_cfg_gpio(struct platform_device *dev) { s3c2410_gpio_cfgpin(S3C2410_GPG(12), S3C2410_GPG12_XMON); s3c2410_gpio_cfgpin(S3C2410_GPG(13), S3C2410_GPG13_nXPON); s3c2410_gpio_cfgpin(S3C2410_GPG(14), S3C2410_GPG14_YMON); s3c2410_gpio_cfgpin(S3C2410_GPG(15), S3C2410_GPG15_nYPON); }
static inline void s3c2410_ts_connect(void) { s3c2410_gpio_cfgpin(S3C2410_GPG(12), S3C2410_GPG12_XMON); s3c2410_gpio_cfgpin(S3C2410_GPG(13), S3C2410_GPG13_nXPON); s3c2410_gpio_cfgpin(S3C2410_GPG(14), S3C2410_GPG14_YMON); s3c2410_gpio_cfgpin(S3C2410_GPG(15), S3C2410_GPG15_nYPON); }
static void s3c2410_pm_prepare(void) { /* ensure at least GSTATUS3 has the resume address */ __raw_writel(virt_to_phys(s3c_cpu_resume), S3C2410_GSTATUS3); S3C_PMDBG("GSTATUS3 0x%08x\n", __raw_readl(S3C2410_GSTATUS3)); S3C_PMDBG("GSTATUS4 0x%08x\n", __raw_readl(S3C2410_GSTATUS4)); if (machine_is_h1940()) { void *base = phys_to_virt(H1940_SUSPEND_CHECK); unsigned long ptr; unsigned long calc = 0; /* generate check for the bootloader to check on resume */ for (ptr = 0; ptr < 0x40000; ptr += 0x400) calc += __raw_readl(base+ptr); __raw_writel(calc, phys_to_virt(H1940_SUSPEND_CHECKSUM)); } /* RX3715 and RX1950 use similar to H1940 code and the * same offsets for resume and checksum pointers */ if (machine_is_rx3715() || machine_is_rx1950()) { void *base = phys_to_virt(H1940_SUSPEND_CHECK); unsigned long ptr; unsigned long calc = 0; /* generate check for the bootloader to check on resume */ for (ptr = 0; ptr < 0x40000; ptr += 0x4) calc += __raw_readl(base+ptr); __raw_writel(calc, phys_to_virt(H1940_SUSPEND_CHECKSUM)); } if ( machine_is_aml_m5900() ) s3c2410_gpio_setpin(S3C2410_GPF(2), 1); if (machine_is_rx1950()) { /* According to S3C2442 user's manual, page 7-17, * when the system is operating in NAND boot mode, * the hardware pin configuration - EINT[23:21] – * must be set as input for starting up after * wakeup from sleep mode */ s3c_gpio_cfgpin(S3C2410_GPG(13), S3C2410_GPIO_INPUT); s3c_gpio_cfgpin(S3C2410_GPG(14), S3C2410_GPIO_INPUT); s3c_gpio_cfgpin(S3C2410_GPG(15), S3C2410_GPIO_INPUT); } }
static void n30_sdi_set_power(unsigned char power_mode, unsigned short vdd) { switch (power_mode) { case MMC_POWER_ON: case MMC_POWER_UP: gpio_set_value(S3C2410_GPG(4), 1); break; case MMC_POWER_OFF: default: gpio_set_value(S3C2410_GPG(4), 0); break; } }
int s3c2412_gpio_set_sleepcfg(unsigned int pin, unsigned int state) { struct samsung_gpio_chip *chip = samsung_gpiolib_getchip(pin); unsigned long offs = pin - chip->chip.base; unsigned long flags; unsigned long slpcon; offs *= 2; if (pin < S3C2410_GPB(0)) return -EINVAL; if (pin >= S3C2410_GPF(0) && pin <= S3C2410_GPG(16)) return -EINVAL; if (pin > S3C2410_GPH(16)) return -EINVAL; local_irq_save(flags); slpcon = __raw_readl(chip->base + 0x0C); slpcon &= ~(3 << offs); slpcon |= state << offs; __raw_writel(slpcon, chip->base + 0x0C); local_irq_restore(flags); return 0; }
void s3c_pm_configure_extint(void) { int pin; /* for each of the external interrupts (EINT0..EINT15) we * need to check wether it is an external interrupt source, * and then configure it as an input if it is not */ for (pin = S3C2410_GPF(0); pin <= S3C2410_GPF(7); pin++) { s3c_pm_check_resume_pin(pin, pin - S3C2410_GPF(0)); } for (pin = S3C2410_GPG(0); pin <= S3C2410_GPG(7); pin++) { s3c_pm_check_resume_pin(pin, (pin - S3C2410_GPG(0))+8); } }
void s3c_pm_configure_extint(void) { int pin; /* */ for (pin = S3C2410_GPF(0); pin <= S3C2410_GPF(7); pin++) { s3c_pm_check_resume_pin(pin, pin - S3C2410_GPF(0)); } for (pin = S3C2410_GPG(0); pin <= S3C2410_GPG(7); pin++) { s3c_pm_check_resume_pin(pin, (pin - S3C2410_GPG(0))+8); } }
static int __init button_dev_init(void) { int ret; if (is_board_rev_B()) { buttons[0].gpio = S3C2410_GPG(5); buttons[1].gpio = S3C2410_GPG(6); buttons[2].gpio = S3C2410_GPG(7); buttons[3].gpio = S3C2410_GPG(11); } ret = misc_register(&misc); printk(DEVICE_NAME"\tinitialized\n"); return ret; }
static long tq2440_backlight_ioctl( struct file *file, unsigned int cmd, unsigned long arg) { switch(cmd) { case 0: gpio_set_value(S3C2410_GPG(4), 0); printk(DEVICE_NAME " Turn Off!\n"); return 0; case 1: gpio_set_value(S3C2410_GPG(4), 1); printk(DEVICE_NAME " Turn On!\n"); return 0; default: return -EINVAL; } }
static int __init dev_init(void) { int ret; ret = misc_register(&misc); printk (DEVICE_NAME" initialized\n"); s3c_gpio_cfgpin(S3C2410_GPG(4), S3C2410_GPIO_OUTPUT); return ret; }
static irqreturn_t usb_simtec_ocirq(int irq, void *pw) { struct s3c2410_hcd_info *info = pw; if (gpio_get_value(S3C2410_GPG(10)) == 0) { pr_debug("usb_simtec: over-current irq (oc detected)\n"); s3c2410_usb_report_oc(info, 3); } else { pr_debug("usb_simtec: over-current irq (oc cleared)\n"); s3c2410_usb_report_oc(info, 0); } return IRQ_HANDLED; }
static void __init n30_init(void) { WARN_ON(gpio_request(S3C2410_GPG(4), "mmc power")); s3c24xx_fb_set_platdata(&n30_fb_info); s3c24xx_udc_set_platdata(&n30_udc_cfg); s3c24xx_mci_set_platdata(&n30_mci_cfg); s3c_i2c0_set_platdata(&n30_i2ccfg); /* Turn off suspend on both USB ports, and switch the * selectable USB port to USB device mode. */ s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST | S3C2410_MISCCR_USBSUSPND0 | S3C2410_MISCCR_USBSUSPND1, 0x0); if (machine_is_n30()) { /* Turn off suspend on both USB ports, and switch the * selectable USB port to USB device mode. */ s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST | S3C2410_MISCCR_USBSUSPND0 | S3C2410_MISCCR_USBSUSPND1, 0x0); platform_add_devices(n30_devices, ARRAY_SIZE(n30_devices)); } if (machine_is_n35()) { /* Turn off suspend and switch the selectable USB port * to USB device mode. Turn on suspend for the host * port since it is not connected on the N35. * * Actually, the host port is available at some pads * on the back of the device, so it would actually be * possible to add a USB device inside the N35 if you * are willing to do some hardware modifications. */ s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST | S3C2410_MISCCR_USBSUSPND0 | S3C2410_MISCCR_USBSUSPND1, S3C2410_MISCCR_USBSUSPND0); platform_add_devices(n35_devices, ARRAY_SIZE(n35_devices)); } WARN_ON(gpio_request(S3C2410_GPB(3), "udc pup")); gpio_direction_output(S3C2410_GPB(3), 0); }
static void __init mini2440_machine_init(void) { s3c24xx_fb_set_platdata(&s3c24xx_fb_info); s3c_i2c0_set_platdata(NULL); s3c2410_gpio_cfgpin(S3C2410_GPC(0), S3C2410_GPC0_LEND); printk("S3C2410_GPA=%d\n",S3C2410_GPA(0)); printk("S3C2410_GPB=%d\n",S3C2410_GPB(0)); printk("S3C2410_GPC=%d\n",S3C2410_GPC(0)); printk("S3C2410_GPD=%d\n",S3C2410_GPD(0)); printk("S3C2410_GPE=%d\n",S3C2410_GPE(0)); printk("S3C2410_GPF=%d\n",S3C2410_GPF(0)); printk("S3C2410_GPG=%d\n",S3C2410_GPG(0)); printk("S3C2410_GPH=%d\n",S3C2410_GPH(0)); s3c_device_nand.dev.platform_data = &friendly_arm_nand_info; s3c_device_sdi.dev.platform_data = &mini2440_mmc_cfg; platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices)); platform_device_register_simple("GPIODEV", 0, &gpiodev_resource, 1); //GPIO resource MAP s3c_pm_init(); }
.ulcon = 0x43, .ufcon = 0x51, }, /* On the N30 the bluetooth controller is connected here. * On the N35 and variants the GPS receiver is connected here. */ [2] = { .hwport = 2, .flags = 0, .ucon = 0x2c5, .ulcon = 0x03, .ufcon = 0x51, }, }; static struct s3c2410_udc_mach_info n30_udc_cfg __initdata = { .vbus_pin = S3C2410_GPG(1), .vbus_pin_inverted = 0, .pullup_pin = S3C2410_GPB(3), }; static struct gpio_keys_button n30_buttons[] = { { .gpio = S3C2410_GPF(0), .code = KEY_POWER, .desc = "Power", .active_low = 0, }, { .gpio = S3C2410_GPG(9), .code = KEY_UP, .desc = "Thumbwheel Up",
.nr_chips = 1, .nr_partitions = ARRAY_SIZE(rx1950_nand_part), .partitions = rx1950_nand_part, }, }; static struct s3c2410_platform_nand rx1950_nand_info = { .tacls = 25, .twrph0 = 50, .twrph1 = 15, .nr_sets = ARRAY_SIZE(rx1950_nand_sets), .sets = rx1950_nand_sets, }; static struct s3c2410_udc_mach_info rx1950_udc_cfg __initdata = { .vbus_pin = S3C2410_GPG(5), .vbus_pin_inverted = 1, .pullup_pin = S3C2410_GPJ(5), }; static struct s3c2410_ts_mach_info rx1950_ts_cfg __initdata = { .delay = 10000, .presc = 49, .oversampling_shift = 3, }; static struct gpio_keys_button rx1950_gpio_keys_table[] = { { .code = KEY_POWER, .gpio = S3C2410_GPF(0), .active_low = 1,
{ return (latch_state >> (offset + 16)) & 1; } struct gpio_chip h1940_latch_gpiochip = { .base = H1940_LATCH_GPIO(0), .owner = THIS_MODULE, .label = "H1940_LATCH", .ngpio = 16, .direction_output = h1940_gpiolib_latch_output, .set = h1940_gpiolib_latch_set, .get = h1940_gpiolib_latch_get, }; static struct s3c2410_udc_mach_info h1940_udc_cfg __initdata = { .vbus_pin = S3C2410_GPG(5), .vbus_pin_inverted = 1, .pullup_pin = H1940_LATCH_USB_DP, }; static struct s3c2410_ts_mach_info h1940_ts_cfg __initdata = { .delay = 10000, .presc = 49, .oversampling_shift = 2, .cfg_gpio = s3c24xx_ts_cfg_gpio, }; /** * Set lcd on or off **/ static struct s3c2410fb_display h1940_lcd __initdata = {
}; static struct platform_device mini2440_device_eth = { .name = "dm9000", .id = -1, .num_resources = ARRAY_SIZE(mini2440_dm9k_resource), .resource = mini2440_dm9k_resource, .dev = { .platform_data = &mini2440_dm9k_pdata, }, }; /* MMC/SD */ static struct s3c24xx_mci_pdata mini2440_mmc_cfg = { .gpio_detect = S3C2410_GPG(8), .gpio_wprotect = S3C2410_GPH(8), .set_power = NULL, .ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34, }; /* devices we initialise */ static struct platform_device *mini2440_devices[] __initdata = { &s3c_device_usb, &s3c_device_rtc, &s3c_device_lcd, &s3c_device_wdt, &s3c_device_i2c0, &s3c_device_iis,
static struct pin_desc *irq_pd; /* 创建一个等待队列 */ static DECLARE_WAIT_QUEUE_HEAD(button_waitq); static DEFINE_SEMAPHORE(button_lock); //定义互斥锁 wait_queue_head_t write_Monitor; //struct semaphore sem; static atomic_t canopen = ATOMIC_INIT(1); /* 中断事件标志, 中断服务程序将它置1,sixth_drv_read将它清0 */ static volatile int ev_press = 0; static struct pin_desc{ unsigned int pin; unsigned int key_val; }; static unsigned char key_val; static struct pin_desc pins_desc[6] = { {S3C2410_GPG(0), 0x01}, {S3C2410_GPG(3), 0x02}, {S3C2410_GPG(5), 0x03}, {S3C2410_GPG(6), 0x04}, {S3C2410_GPG(7), 0x05}, {S3C2410_GPG(11), 0x06}, }; static irqreturn_t gpio_threadhandler(int irq, void *dev_id) { return IRQ_HANDLED; } static irqreturn_t buttons_irq(int irq, void *dev_id) { irq_pd = (struct pin_desc *)dev_id; mod_timer(&buttons_timer,jiffies + HZ/100);//改变定时器的时间
static void __init jive_machine_init(void) { /* register system core operations for managing low level suspend */ register_syscore_ops(&jive_pm_syscore_ops); /* write our sleep configurations for the IO. Pull down all unused * IO, ensure that we have turned off all peripherals we do not * need, and configure the ones we do need. */ /* Port B sleep */ __raw_writel(S3C2412_SLPCON_IN(0) | S3C2412_SLPCON_PULL(1) | S3C2412_SLPCON_HIGH(2) | S3C2412_SLPCON_PULL(3) | S3C2412_SLPCON_PULL(4) | S3C2412_SLPCON_PULL(5) | S3C2412_SLPCON_PULL(6) | S3C2412_SLPCON_HIGH(7) | S3C2412_SLPCON_PULL(8) | S3C2412_SLPCON_PULL(9) | S3C2412_SLPCON_PULL(10), S3C2412_GPBSLPCON); /* Port C sleep */ __raw_writel(S3C2412_SLPCON_PULL(0) | S3C2412_SLPCON_PULL(1) | S3C2412_SLPCON_PULL(2) | S3C2412_SLPCON_PULL(3) | S3C2412_SLPCON_PULL(4) | S3C2412_SLPCON_PULL(5) | S3C2412_SLPCON_LOW(6) | S3C2412_SLPCON_PULL(6) | S3C2412_SLPCON_PULL(7) | S3C2412_SLPCON_PULL(8) | S3C2412_SLPCON_PULL(9) | S3C2412_SLPCON_PULL(10) | S3C2412_SLPCON_PULL(11) | S3C2412_SLPCON_PULL(12) | S3C2412_SLPCON_PULL(13) | S3C2412_SLPCON_PULL(14) | S3C2412_SLPCON_PULL(15), S3C2412_GPCSLPCON); /* Port D sleep */ __raw_writel(S3C2412_SLPCON_ALL_PULL, S3C2412_GPDSLPCON); /* Port F sleep */ __raw_writel(S3C2412_SLPCON_LOW(0) | S3C2412_SLPCON_LOW(1) | S3C2412_SLPCON_LOW(2) | S3C2412_SLPCON_EINT(3) | S3C2412_SLPCON_EINT(4) | S3C2412_SLPCON_EINT(5) | S3C2412_SLPCON_EINT(6) | S3C2412_SLPCON_EINT(7), S3C2412_GPFSLPCON); /* Port G sleep */ __raw_writel(S3C2412_SLPCON_IN(0) | S3C2412_SLPCON_IN(1) | S3C2412_SLPCON_IN(2) | S3C2412_SLPCON_IN(3) | S3C2412_SLPCON_IN(4) | S3C2412_SLPCON_IN(5) | S3C2412_SLPCON_IN(6) | S3C2412_SLPCON_IN(7) | S3C2412_SLPCON_PULL(8) | S3C2412_SLPCON_PULL(9) | S3C2412_SLPCON_IN(10) | S3C2412_SLPCON_PULL(11) | S3C2412_SLPCON_PULL(12) | S3C2412_SLPCON_PULL(13) | S3C2412_SLPCON_IN(14) | S3C2412_SLPCON_PULL(15), S3C2412_GPGSLPCON); /* Port H sleep */ __raw_writel(S3C2412_SLPCON_PULL(0) | S3C2412_SLPCON_PULL(1) | S3C2412_SLPCON_PULL(2) | S3C2412_SLPCON_PULL(3) | S3C2412_SLPCON_PULL(4) | S3C2412_SLPCON_PULL(5) | S3C2412_SLPCON_PULL(6) | S3C2412_SLPCON_IN(7) | S3C2412_SLPCON_IN(8) | S3C2412_SLPCON_PULL(9) | S3C2412_SLPCON_IN(10), S3C2412_GPHSLPCON); /* initialise the power management now we've setup everything. */ s3c_pm_init(); /** TODO - check that this is after the cmdline option! */ s3c_nand_set_platdata(&jive_nand_info); /* initialise the spi */ gpio_request(S3C2410_GPG(13), "lcm reset"); gpio_direction_output(S3C2410_GPG(13), 0); gpio_request(S3C2410_GPB(7), "jive spi"); gpio_direction_output(S3C2410_GPB(7), 1); gpio_request_one(S3C2410_GPB(6), GPIOF_OUT_INIT_LOW, NULL); gpio_free(S3C2410_GPB(6)); gpio_request_one(S3C2410_GPG(8), GPIOF_OUT_INIT_HIGH, NULL); gpio_free(S3C2410_GPG(8)); /* initialise the WM8750 spi */ gpio_request(S3C2410_GPH(10), "jive wm8750 spi"); gpio_direction_output(S3C2410_GPH(10), 1); /* Turn off suspend on both USB ports, and switch the * selectable USB port to USB device mode. */ s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST | S3C2410_MISCCR_USBSUSPND0 | S3C2410_MISCCR_USBSUSPND1, 0x0); s3c24xx_udc_set_platdata(&jive_udc_cfg); s3c24xx_fb_set_platdata(&jive_lcd_config); spi_register_board_info(jive_spi_devs, ARRAY_SIZE(jive_spi_devs)); s3c_i2c0_set_platdata(&jive_i2c_cfg); i2c_register_board_info(0, jive_i2c_devs, ARRAY_SIZE(jive_i2c_devs)); pm_power_off = jive_power_off; platform_add_devices(jive_devices, ARRAY_SIZE(jive_devices)); }
.label = "GPIOE", .owner = THIS_MODULE, .ngpio = 16, }, }, { .chip = { .base = S3C2410_GPF(0), .owner = THIS_MODULE, .label = "GPIOF", .ngpio = 8, .to_irq = s3c24xx_gpiolib_fbank_to_irq, }, }, { .irq_base = IRQ_EINT8, .chip = { .base = S3C2410_GPG(0), .owner = THIS_MODULE, .label = "GPIOG", .ngpio = 16, .to_irq = samsung_gpiolib_to_irq, }, }, { .chip = { .base = S3C2410_GPH(0), .owner = THIS_MODULE, .label = "GPIOH", .ngpio = 15, }, }, /* GPIOS for the S3C2443 and later devices. */ {
.display4 = 0x0, .rgb_if1 = (ILI9320_RGBIF1_RIM_RGB18 | ILI9320_RGBIF1_RM | ILI9320_RGBIF1_CLK_RGBIF), .rgb_if2 = ILI9320_RGBIF2_DPL, .interface2 = 0x0, .interface3 = 0x3, .interface4 = (ILI9320_INTERFACE4_RTNE(16) | ILI9320_INTERFACE4_DIVE(1)), .interface5 = 0x0, .interface6 = 0x0, }; /* LCD SPI support */ static struct spi_gpio_platform_data jive_lcd_spi = { .sck = S3C2410_GPG(8), .mosi = S3C2410_GPB(8), .miso = SPI_GPIO_NO_MISO, }; static struct platform_device jive_device_lcdspi = { .name = "spi-gpio", .id = 1, .dev.platform_data = &jive_lcd_spi, }; /* WM8750 audio code SPI definition */ static struct spi_gpio_platform_data jive_wm8750_spi = { .sck = S3C2410_GPB(4),
static void jive_lcm_reset(unsigned int set) { printk(KERN_DEBUG "%s(%d)\n", __func__, set); gpio_set_value(S3C2410_GPG(13), set); }
static struct timer_list key_timers[KEY_COUNT]; //定义6个按键去抖动定时器 static DECLARE_WAIT_QUEUE_HEAD(button_waitq); //定义并初始化等待队列 //组织硬件资源结构体 struct button_irq_desc { int irq; //中断号 int pin; //引脚 int pin_setting; //引脚配置 char *name; //按键名称,注意这个名称,在后面的一个现象中会出现 }; //定义6个按键资源结构体数组 static struct button_irq_desc button_irqs[] = { {IRQ_EINT8 , S3C2410_GPG(0) , S3C2410_GPG0_EINT8 , "KEY0"}, {IRQ_EINT11, S3C2410_GPG(3) , S3C2410_GPG3_EINT11 , "KEY1"}, {IRQ_EINT13, S3C2410_GPG(5) , S3C2410_GPG5_EINT13 , "KEY2"}, {IRQ_EINT14, S3C2410_GPG(6) , S3C2410_GPG6_EINT14 , "KEY3"}, {IRQ_EINT15, S3C2410_GPG(7) , S3C2410_GPG7_EINT15 , "KEY4"}, {IRQ_EINT19, S3C2410_GPG(11), S3C2410_GPG11_EINT19, "KEY5"}, }; static irqreturn_t buttons_interrupt(int irq, void *dev_id) { //获取当前按键资源的索引 int key = (int)dev_id; if(key_status[key] == KEY_UP) { //设置当前按键的状态为不确定
static struct snd_soc_jack_pin hp_jack_pins[] = { { .pin = "Headphone Jack", .mask = SND_JACK_HEADPHONE, }, { .pin = "Speaker", .mask = SND_JACK_HEADPHONE, .invert = 1, }, }; static struct snd_soc_jack_gpio hp_jack_gpios[] = { { .gpio = S3C2410_GPG(4), .name = "hp-gpio", .report = SND_JACK_HEADPHONE, .invert = 1, .debounce_time = 200, }, }; static int h1940_startup(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; return snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_rates); }
int usb_gec2440_init(void) { unsigned long upllvalue = (0x78<<12)|(0x02<<4)|(0x03); printk("USB Control, (c) 2009 gec2440\n"); s3c_device_usb.dev.platform_data = &usb_gec2440_info; while(upllvalue!=__raw_readl(S3C2410_UPLLCON)) { __raw_writel(upllvalue,S3C2410_UPLLCON); mdelay(1); } return 0; } /* MMC/SD */ static struct s3c24xx_mci_pdata gec2440_mmc_cfg = { .gpio_detect = S3C2410_GPG(8), .gpio_wprotect = S3C2410_GPH(8), .set_power = NULL, .ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34, }; //LED #if defined(HARDWARE_VERSION_A) static struct gpio_led gec2440_led_pins[] = { { .name = "LED1", .gpio = S3C2410_GPF(5), .active_low = true, }, {
S3C2410_GPD10_VD18 | S3C2410_GPD11_VD19 | S3C2410_GPD12_VD20 | S3C2410_GPD13_VD21 | S3C2410_GPD14_VD22 | S3C2410_GPD15_VD23), .gpdcon_mask = (S3C2410_GPDCON_MASK(2) | S3C2410_GPDCON_MASK(3) | S3C2410_GPDCON_MASK(4) | S3C2410_GPDCON_MASK(5) | S3C2410_GPDCON_MASK(6) | S3C2410_GPDCON_MASK(7) | S3C2410_GPDCON_MASK(10) | S3C2410_GPDCON_MASK(11)| S3C2410_GPDCON_MASK(12) | S3C2410_GPDCON_MASK(13)| S3C2410_GPDCON_MASK(14) | S3C2410_GPDCON_MASK(15)), }; /* MMC/SD */ static struct s3c24xx_mci_pdata mini2440_mmc_cfg __initdata = { .gpio_detect = S3C2410_GPG(8), .gpio_wprotect = S3C2410_GPH(8), .set_power = NULL, .ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34, }; /* NAND Flash on MINI2440 board */ static struct mtd_partition mini2440_default_nand_part[] __initdata = { [0] = { .name = "u-boot", .size = SZ_256K, .offset = 0, }, [1] = { .name = "u-boot-env",
/* SPI */ static void spi_gpio_cs(struct s3c2410_spigpio_info *spi, int cs) { switch (cs) { case BITBANG_CS_ACTIVE: gpio_set_value(S3C2410_GPB(5), 0); break; case BITBANG_CS_INACTIVE: gpio_set_value(S3C2410_GPB(5), 1); break; } } static struct s3c2410_spigpio_info spi_gpio_cfg = { .pin_clk = S3C2410_GPG(7), .pin_mosi = S3C2410_GPG(6), .pin_miso = S3C2410_GPG(5), .chip_select = &spi_gpio_cs, }; static struct platform_device qt2410_spi = { .name = "s3c24xx-spi-gpio", .id = 1, .dev = { .platform_data = &spi_gpio_cfg, }, }; /* Board devices */
static struct snd_soc_jack_pin hp_jack_pins[] = { { .pin = "Headphone Jack", .mask = SND_JACK_HEADPHONE, }, { .pin = "Speaker", .mask = SND_JACK_HEADPHONE, .invert = 1, }, }; static struct snd_soc_jack_gpio hp_jack_gpios[] = { [0] = { .gpio = S3C2410_GPG(12), .name = "hp-gpio", .report = SND_JACK_HEADPHONE, .invert = 1, .debounce_time = 200, }, }; static struct snd_soc_ops rx1950_ops = { .startup = rx1950_startup, .hw_params = rx1950_hw_params, }; static struct snd_soc_dai_link rx1950_uda1380_dai[] = { { .name = "uda1380",
S3C2410_GPD6_VD14 | S3C2410_GPD7_VD15 | S3C2410_GPD10_VD18 | S3C2410_GPD11_VD19 | S3C2410_GPD12_VD20 | S3C2410_GPD13_VD21 | S3C2410_GPD14_VD22 | S3C2410_GPD15_VD23), .gpdcon_mask = (S3C2410_GPDCON_MASK(2) | S3C2410_GPDCON_MASK(3) | S3C2410_GPDCON_MASK(4) | S3C2410_GPDCON_MASK(5) | S3C2410_GPDCON_MASK(6) | S3C2410_GPDCON_MASK(7) | S3C2410_GPDCON_MASK(10) | S3C2410_GPDCON_MASK(11)| S3C2410_GPDCON_MASK(12) | S3C2410_GPDCON_MASK(13)| S3C2410_GPDCON_MASK(14) | S3C2410_GPDCON_MASK(15)), }; static struct s3c24xx_mci_pdata mini2440_mmc_cfg __initdata = { .gpio_detect = S3C2410_GPG(8), .gpio_wprotect = S3C2410_GPH(8), .set_power = NULL, .ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34, }; static struct mtd_partition mini2440_default_nand_part[] __initdata = { [0] = { .name = "u-boot", .size = SZ_256K, .offset = 0, }, [1] = { .name = "u-boot-env", .size = SZ_128K,