X-Git-Url: http://git.rohieb.name/openwrt.git/blobdiff_plain/3a242b3d5130f55bb857dd319da895b19159e513..HEAD:/target/linux/s3c24xx/files-2.6.30/arch/arm/mach-s3c2442/mach-gta02.c diff --git a/target/linux/s3c24xx/files-2.6.30/arch/arm/mach-s3c2442/mach-gta02.c b/target/linux/s3c24xx/files-2.6.30/arch/arm/mach-s3c2442/mach-gta02.c index 30405ad80..49ab6c43b 100644 --- a/target/linux/s3c24xx/files-2.6.30/arch/arm/mach-s3c2442/mach-gta02.c +++ b/target/linux/s3c24xx/files-2.6.30/arch/arm/mach-s3c2442/mach-gta02.c @@ -38,6 +38,8 @@ #include #include #include +#include +#include #include #include @@ -89,6 +91,7 @@ #include #include #include +#include #include #include @@ -112,7 +115,6 @@ #include #include -#include /* arbitrates which sensor IRQ owns the shared SPI bus */ static spinlock_t motion_irq_lock; @@ -275,7 +277,7 @@ static long gta02_panic_blink(long count) led ^= 1; s3c2410_gpio_cfgpin(GTA02_GPIO_AUX_LED, S3C2410_GPIO_OUTPUT); - gta02_gpb_setpin(GTA02_GPIO_AUX_LED, led); + s3c2410_gpio_setpin(GTA02_GPIO_AUX_LED, led); last_blink = count; return delay; @@ -938,11 +940,11 @@ static void gta02_udc_command(enum s3c2410_udc_cmd_e cmd) switch (cmd) { case S3C2410_UDC_P_ENABLE: printk(KERN_DEBUG "%s S3C2410_UDC_P_ENABLE\n", __func__); - gta02_gpb_setpin(GTA02_GPIO_USB_PULLUP, 1); + s3c2410_gpio_setpin(GTA02_GPIO_USB_PULLUP, 1); break; case S3C2410_UDC_P_DISABLE: printk(KERN_DEBUG "%s S3C2410_UDC_P_DISABLE\n", __func__); - gta02_gpb_setpin(GTA02_GPIO_USB_PULLUP, 0); + s3c2410_gpio_setpin(GTA02_GPIO_USB_PULLUP, 0); break; case S3C2410_UDC_P_RESET: printk(KERN_DEBUG "%s S3C2410_UDC_P_RESET\n", __func__); @@ -1080,7 +1082,7 @@ static struct platform_device gta02_bl_dev = { static void gta02_jbt6k74_reset(int devidx, int level) { - gpio_set_value(GTA02_GPIO_GLAMO(4), level); + gpio_set_value(GTA02_GPIO_GLAMO(4), level); } static void gta02_jbt6k74_probe_completed(struct device *dev) @@ -1247,62 +1249,64 @@ static struct platform_device gta02_spi_gpio_dev = { /*----------- / SPI: Accelerometers attached to SPI of s3c244x ----------------- */ -static struct resource gta02_led_resources[] = { +static struct gpio_led gta02_gpio_leds[] = { { .name = "gta02-power:orange", - .start = GTA02_GPIO_PWR_LED1, - .end = GTA02_GPIO_PWR_LED1, + .gpio = GTA02_GPIO_PWR_LED1, }, { .name = "gta02-power:blue", - .start = GTA02_GPIO_PWR_LED2, - .end = GTA02_GPIO_PWR_LED2, + .gpio = GTA02_GPIO_PWR_LED2, }, { .name = "gta02-aux:red", - .start = GTA02_GPIO_AUX_LED, - .end = GTA02_GPIO_AUX_LED, + .gpio = GTA02_GPIO_AUX_LED, }, }; -struct platform_device gta02_led_dev = { - .name = "gta02-led", - .num_resources = ARRAY_SIZE(gta02_led_resources), - .resource = gta02_led_resources, +static struct gpio_led_platform_data gta02_gpio_leds_pdata = { + .leds = gta02_gpio_leds, + .num_leds = ARRAY_SIZE(gta02_gpio_leds), }; -static struct resource gta02_button_resources[] = { - [0] = { - .start = GTA02_GPIO_AUX_KEY, - .end = GTA02_GPIO_AUX_KEY, - }, - [1] = { - .start = GTA02_GPIO_HOLD_KEY, - .end = GTA02_GPIO_HOLD_KEY, - }, - [2] = { - .start = GTA02_GPIO_JACK_INSERT, - .end = GTA02_GPIO_JACK_INSERT, +struct platform_device gta02_led_dev = { + .name = "leds-gpio", + .id = -1, + .dev = { + .platform_data = >a02_gpio_leds_pdata, }, - [3] = { - .start = 0, - .end = 0, +}; + +static struct gpio_keys_button gta02_buttons[] = { + { + .gpio = GTA02_GPIO_AUX_KEY, + .code = KEY_PHONE, + .desc = "Aux", + .type = EV_KEY, }, - [4] = { - .start = 0, - .end = 0, + { + .gpio = GTA02_GPIO_HOLD_KEY, + .code = KEY_PAUSE, + .desc = "Hold", + .type = EV_KEY, }, }; +static struct gpio_keys_platform_data gta02_buttons_pdata = { + .buttons = gta02_buttons, + .nbuttons = ARRAY_SIZE(gta02_buttons), +}; + static struct platform_device gta02_button_dev = { - .name = "gta02-button", - .num_resources = ARRAY_SIZE(gta02_button_resources), - .resource = gta02_button_resources, + .name = "gpio-keys", + .id = -1, + .dev = { + .platform_data = >a02_buttons_pdata, + }, }; static struct platform_device gta02_pm_usbhost_dev = { .name = "gta02-pm-host", }; - /* USB */ static struct s3c2410_hcd_info gta02_usb_info = { .port[0] = { @@ -1434,9 +1438,9 @@ static struct glamo_mmc_platform_data gta02_glamo_mmc_pdata = { static struct glamo_platform_data gta02_glamo_pdata = { .fb_data = >a02_glamo_fb_pdata, .mmc_data = >a02_glamo_mmc_pdata, - .gpio_base = GTA02_GPIO_GLAMO_BASE, + .gpio_base = GTA02_GPIO_GLAMO_BASE, - .osci_clock_rate = 32768, + .osci_clock_rate = 32768, .glamo_irq_is_wired = glamo_irq_is_wired, .glamo_external_reset = gta02_glamo_external_reset, @@ -1501,10 +1505,10 @@ struct spi_gpio_platform_data spigpio_platform_data = { static struct platform_device spigpio_device = { .name = "spi_gpio", - .id = 2, + .id = 2, .dev = { .platform_data = &spigpio_platform_data, - .parent = >a02_glamo_dev.dev, + .parent = >a02_glamo_dev.dev, }, }; @@ -1570,12 +1574,13 @@ static struct platform_device *gta02_devices_pmu_children[] = { >a02_resume_reason_device, }; -static void gta02_register_glamo() { +static void gta02_register_glamo(void) +{ platform_device_register(>a02_glamo_dev); - if (!gpio_request(GTA02_GPIO_GLAMO(4), "jbt6k74 reset")) - printk("gta02: Failed to request jbt6k74 reset pin\n"); - if (!gpio_direction_output(GTA02_GPIO_GLAMO(4), 1)) - printk("gta02: Failed to configure jbt6k74 reset pin\n"); + if (gpio_request(GTA02_GPIO_GLAMO(4), "jbt6k74 reset")) + printk("gta02: Failed to request jbt6k74 reset pin\n"); + if (gpio_direction_output(GTA02_GPIO_GLAMO(4), 1)) + printk("gta02: Failed to configure jbt6k74 reset pin\n"); platform_device_register(&spigpio_device); } @@ -1595,8 +1600,8 @@ static void gta02_pmu_regulator_registered(struct pcf50633 *pcf, int id) pdev = >a02_pm_gps_dev; break; case PCF50633_REGULATOR_HCLDO: - gta02_register_glamo(); - return; + gta02_register_glamo(); + return; default: return; } @@ -1623,7 +1628,7 @@ static void gta02_pmu_attach_child_devices(struct pcf50633 *pcf) platform_add_devices(gta02_devices_pmu_children, ARRAY_SIZE(gta02_devices_pmu_children)); - regulator_has_full_constraints(); + regulator_has_full_constraints(); } static void gta02_poweroff(void) @@ -1632,6 +1637,57 @@ static void gta02_poweroff(void) PCF50633_OOCSHDWN_GOSTDBY, PCF50633_OOCSHDWN_GOSTDBY); } + +/* On hardware rev 5 and earlier the leds are missing a resistor and reading + * from their gpio pins will always return 0, so we have to shadow the + * led states software */ +static unsigned long gpb_shadow; +extern struct s3c_gpio_chip s3c24xx_gpios[]; + +static void gta02_gpb_set(struct gpio_chip *chip, + unsigned offset, int value) +{ + void __iomem *base = S3C24XX_GPIO_BASE(S3C2410_GPB0); + unsigned long flags; + unsigned long dat; + + local_irq_save(flags); + + dat = __raw_readl(base + 0x04) | gpb_shadow; + dat &= ~(1 << offset); + gpb_shadow &= ~(1 << offset); + if (value) { + dat |= 1 << offset; + switch (offset) { + case 0 ... 2: + gpb_shadow |= 1 << offset; + break; + default: + break; + } + } + __raw_writel(dat, base + 0x04); + + local_irq_restore(flags); +} + +static int gta02_gpb_get(struct gpio_chip *chip, unsigned offset) +{ + void __iomem *base = S3C24XX_GPIO_BASE(S3C2410_GPB0); + unsigned long val; + + val = __raw_readl(base + 0x04) | gpb_shadow; + val >>= offset; + val &= 1; + + return val; +} + +static void gta02_hijack_gpb(void) { + s3c24xx_gpios[1].chip.set = gta02_gpb_set; + s3c24xx_gpios[1].chip.get = gta02_gpb_get; +} + static void __init gta02_machine_init(void) { int rc; @@ -1648,6 +1704,8 @@ static void __init gta02_machine_init(void) default: break; } + if (S3C_SYSTEM_REV_ATAG <= GTA02v5_SYSTEM_REV) + gta02_hijack_gpb(); spin_lock_init(&motion_irq_lock); @@ -1725,13 +1783,13 @@ void DEBUG_LED(int n) { switch (n) { case 0: - gta02_gpb_setpin(GTA02_GPIO_PWR_LED1, 1); + s3c2410_gpio_setpin(GTA02_GPIO_PWR_LED1, 1); break; case 1: - gta02_gpb_setpin(GTA02_GPIO_PWR_LED2, 1); + s3c2410_gpio_setpin(GTA02_GPIO_PWR_LED2, 1); break; default: - gta02_gpb_setpin(GTA02_GPIO_AUX_LED, 1); + s3c2410_gpio_setpin(GTA02_GPIO_AUX_LED, 1); break; } }