X-Git-Url: http://git.rohieb.name/openwrt.git/blobdiff_plain/a9d94ee88b335a91c73d346b41d78058a1e0076e..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 b46180212..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 @@ -35,8 +35,11 @@ #include #include #include +#include #include #include +#include +#include #include #include @@ -74,7 +77,6 @@ #include #include #include -#include #include #include @@ -89,6 +91,7 @@ #include #include #include +#include #include #include @@ -97,7 +100,6 @@ #include #include #include -#include #include #include @@ -113,7 +115,6 @@ #include #include -#include /* arbitrates which sensor IRQ owns the shared SPI bus */ static spinlock_t motion_irq_lock; @@ -276,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; @@ -464,7 +465,7 @@ static void gta02_pmu_force_shutdown(struct pcf50633 *pcf) static void gta02_udc_vbus_draw(unsigned int ma) { - if (!gta02_pcf) + if (!gta02_pcf) return; gta02_usb_vbus_draw = ma; @@ -624,8 +625,8 @@ struct pcf50633_platform_data gta02_pcf_pdata = { [PCF50633_REGULATOR_LDO1] = { .constraints = { .name = "GSENSOR_3V3", - .min_uV = 1300000, - .max_uV = 1300000, + .min_uV = 3300000, + .max_uV = 3300000, .valid_modes_mask = REGULATOR_MODE_NORMAL, .apply_uV = 1, }, @@ -664,8 +665,8 @@ struct pcf50633_platform_data gta02_pcf_pdata = { [PCF50633_REGULATOR_LDO5] = { .constraints = { .name = "RF_3V", - .min_uV = 1500000, - .max_uV = 1500000, + .min_uV = 3000000, + .max_uV = 3000000, .valid_modes_mask = REGULATOR_MODE_NORMAL, .apply_uV = 1, .state_mem = { @@ -678,10 +679,11 @@ struct pcf50633_platform_data gta02_pcf_pdata = { [PCF50633_REGULATOR_LDO6] = { .constraints = { .name = "LCM_3V", - .min_uV = 0, - .max_uV = 3300000, + .min_uV = 3000000, + .max_uV = 3000000, .always_on = 1, .valid_modes_mask = REGULATOR_MODE_NORMAL, + .apply_uV = 1, }, .num_consumer_supplies = 0, }, @@ -715,28 +717,21 @@ static void mangle_pmu_pdata_by_system_rev(void) /* FIXME: this is only in v1 due to wrong PMU variant */ reg_init_data[PCF50633_REGULATOR_DOWN2] .constraints.state_mem.enabled = 1; - break; - case GTA02v2_SYSTEM_REV: - case GTA02v3_SYSTEM_REV: - case GTA02v4_SYSTEM_REV: - case GTA02v5_SYSTEM_REV: - case GTA02v6_SYSTEM_REV: - reg_init_data[PCF50633_REGULATOR_LDO1] - .constraints.min_uV = 3300000; + reg_init_data[PCF50633_REGULATOR_LDO1] - .constraints.min_uV = 3300000; + .constraints.min_uV = 1300000; reg_init_data[PCF50633_REGULATOR_LDO1] - .constraints.state_mem.enabled = 0; + .constraints.max_uV = 1300000; reg_init_data[PCF50633_REGULATOR_LDO5] - .constraints.min_uV = 3000000; + .constraints.min_uV = 1500000; reg_init_data[PCF50633_REGULATOR_LDO5] - .constraints.max_uV = 3000000; + .constraints.max_uV = 1500000; reg_init_data[PCF50633_REGULATOR_LDO6] - .constraints.min_uV = 3000000; + .constraints.min_uV = 0; reg_init_data[PCF50633_REGULATOR_LDO6] - .constraints.max_uV = 3000000; + .constraints.max_uV = 3300000; reg_init_data[PCF50633_REGULATOR_LDO6] .constraints.apply_uV = 1; break; @@ -945,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__); @@ -1087,7 +1082,7 @@ static struct platform_device gta02_bl_dev = { static void gta02_jbt6k74_reset(int devidx, int level) { - glamo_lcm_reset(>a02_glamo_dev, level); + gpio_set_value(GTA02_GPIO_GLAMO(4), level); } static void gta02_jbt6k74_probe_completed(struct device *dev) @@ -1166,13 +1161,12 @@ struct lis302dl_platform_data lis302_pdata_bottom = { static struct spi_board_info gta02_spi_board_info[] = { { .modalias = "jbt6k74", - /* platform_data */ .platform_data = &jbt6k74_pdata, - /* controller_data */ + .controller_data = (void*)GTA02_GPIO_GLAMO(12), /* irq */ .max_speed_hz = 100 * 1000, .bus_num = 2, - /* chip_select */ + .chip_select = 0 }, { .modalias = "lis302dl", @@ -1255,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] = { @@ -1369,6 +1365,35 @@ static void gta02_glamo_external_reset(int level) s3c2410_gpio_cfgpin(GTA02_GPIO_3D_RESET, S3C2410_GPIO_OUTPUT); } +/* +static struct fb_videomode gta02_glamo_modes[] = { + { + .name = "480x640", + .xres = 480, + .yres = 640, + .pixclock = 40816, + .left_margin = 8, + .right_margin = 63, + .upper_margin = 2, + .lower_margin = 4, + .hsync_len = 8, + .vsync_len = 2, + .vmode = FB_VMODE_NONINTERLACED, + }, { + .name = "240x320", + .xres = 240, + .yres = 320, + .pixclock = 40816, + .left_margin = 8, + .right_margin = 88, + .upper_margin = 2, + .lower_margin = 2, + .hsync_len = 8, + .vsync_len = 2, + .vmode = FB_VMODE_NONINTERLACED, + } +};*/ + static struct fb_videomode gta02_glamo_modes[] = { { .name = "480x640", @@ -1397,6 +1422,7 @@ static struct fb_videomode gta02_glamo_modes[] = { } }; + static struct glamo_fb_platform_data gta02_glamo_fb_pdata = { .width = 43, .height = 58, @@ -1405,24 +1431,16 @@ static struct glamo_fb_platform_data gta02_glamo_fb_pdata = { .modes = gta02_glamo_modes, }; -static struct glamo_spigpio_platform_data gta02_glamo_spigpio_pdata = { - .pin_clk = GLAMO_GPIO10_OUTPUT, - .pin_mosi = GLAMO_GPIO11_OUTPUT, - .pin_cs = GLAMO_GPIO12_OUTPUT, - .pin_miso = 0, - .bus_num = 2, -}; - static struct glamo_mmc_platform_data gta02_glamo_mmc_pdata = { .glamo_mmc_use_slow = gta02_glamo_mci_use_slow, }; static struct glamo_platform_data gta02_glamo_pdata = { - .fb_data = >a02_glamo_fb_pdata, - .spigpio_data = >a02_glamo_spigpio_pdata, - .mmc_data = >a02_glamo_mmc_pdata, + .fb_data = >a02_glamo_fb_pdata, + .mmc_data = >a02_glamo_mmc_pdata, + .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, @@ -1478,6 +1496,22 @@ static void mangle_glamo_res_by_system_rev(void) } } +struct spi_gpio_platform_data spigpio_platform_data = { + .sck = GTA02_GPIO_GLAMO(10), + .mosi = GTA02_GPIO_GLAMO(11), + .miso = GTA02_GPIO_GLAMO(5), + .num_chipselect = 1, +}; + +static struct platform_device spigpio_device = { + .name = "spi_gpio", + .id = 2, + .dev = { + .platform_data = &spigpio_platform_data, + .parent = >a02_glamo_dev.dev, + }, +}; + static void __init gta02_map_io(void) { s3c24xx_init_io(gta02_iodesc, ARRAY_SIZE(gta02_iodesc)); @@ -1525,7 +1559,6 @@ static struct platform_device *gta02_devices[] __initdata = { &s3c24xx_pwm_device, >a02_led_dev, >a02_pm_wlan_dev, /* not dependent on PMU */ - &s3c_device_iis, &s3c_device_i2c0, }; @@ -1541,6 +1574,16 @@ static struct platform_device *gta02_devices_pmu_children[] = { >a02_resume_reason_device, }; +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"); + platform_device_register(&spigpio_device); +} + static void gta02_pmu_regulator_registered(struct pcf50633 *pcf, int id) { struct platform_device *regulator, *pdev; @@ -1557,10 +1600,10 @@ static void gta02_pmu_regulator_registered(struct pcf50633 *pcf, int id) pdev = >a02_pm_gps_dev; break; case PCF50633_REGULATOR_HCLDO: - pdev = >a02_glamo_dev; - break; + gta02_register_glamo(); + return; default: - return; + return; } pdev->dev.parent = ®ulator->dev; @@ -1585,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) @@ -1594,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; @@ -1610,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); @@ -1634,10 +1730,11 @@ static void __init gta02_machine_init(void) s3c2410_gpio_setpin(S3C2410_GPD13, 1); s3c2410_gpio_cfgpin(S3C2410_GPD13, S3C2410_GPIO_OUTPUT); + s3c24xx_udc_set_platdata(>a02_udc_cfg); s3c_i2c0_set_platdata(NULL); set_s3c2410ts_info(>a02_ts_cfg); - + mangle_glamo_res_by_system_rev(); i2c_register_board_info(0, gta02_i2c_devs, ARRAY_SIZE(gta02_i2c_devs)); @@ -1686,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; } }