|
@@ -335,3 +335,117 @@ static struct pxafb_mode_info fb_mode_info[] = {
|
|
|
.left_margin = 7,
|
|
|
.right_margin = 13,
|
|
|
|
|
|
+ .vsync_len = 20,
|
|
|
+ .upper_margin = 0,
|
|
|
+ .lower_margin = 0,
|
|
|
+
|
|
|
+ .sync = 0,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct pxafb_mach_info fb_info = {
|
|
|
+ .modes = fb_mode_info,
|
|
|
+ .num_modes = 1,
|
|
|
+ .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
|
|
|
+};
|
|
|
+
|
|
|
+static int viper_backlight_init(struct device *dev)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ /* GPIO9 and 10 control FB backlight. Initialise to off */
|
|
|
+ ret = gpio_request(VIPER_BCKLIGHT_EN_GPIO, "Backlight");
|
|
|
+ if (ret)
|
|
|
+ goto err_request_bckl;
|
|
|
+
|
|
|
+ ret = gpio_request(VIPER_LCD_EN_GPIO, "LCD");
|
|
|
+ if (ret)
|
|
|
+ goto err_request_lcd;
|
|
|
+
|
|
|
+ ret = gpio_direction_output(VIPER_BCKLIGHT_EN_GPIO, 0);
|
|
|
+ if (ret)
|
|
|
+ goto err_dir;
|
|
|
+
|
|
|
+ ret = gpio_direction_output(VIPER_LCD_EN_GPIO, 0);
|
|
|
+ if (ret)
|
|
|
+ goto err_dir;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+
|
|
|
+err_dir:
|
|
|
+ gpio_free(VIPER_LCD_EN_GPIO);
|
|
|
+err_request_lcd:
|
|
|
+ gpio_free(VIPER_BCKLIGHT_EN_GPIO);
|
|
|
+err_request_bckl:
|
|
|
+ dev_err(dev, "Failed to setup LCD GPIOs\n");
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+static int viper_backlight_notify(struct device *dev, int brightness)
|
|
|
+{
|
|
|
+ gpio_set_value(VIPER_LCD_EN_GPIO, !!brightness);
|
|
|
+ gpio_set_value(VIPER_BCKLIGHT_EN_GPIO, !!brightness);
|
|
|
+
|
|
|
+ return brightness;
|
|
|
+}
|
|
|
+
|
|
|
+static void viper_backlight_exit(struct device *dev)
|
|
|
+{
|
|
|
+ gpio_free(VIPER_LCD_EN_GPIO);
|
|
|
+ gpio_free(VIPER_BCKLIGHT_EN_GPIO);
|
|
|
+}
|
|
|
+
|
|
|
+static struct platform_pwm_backlight_data viper_backlight_data = {
|
|
|
+ .pwm_id = 0,
|
|
|
+ .max_brightness = 100,
|
|
|
+ .dft_brightness = 100,
|
|
|
+ .pwm_period_ns = 1000000,
|
|
|
+ .init = viper_backlight_init,
|
|
|
+ .notify = viper_backlight_notify,
|
|
|
+ .exit = viper_backlight_exit,
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device viper_backlight_device = {
|
|
|
+ .name = "pwm-backlight",
|
|
|
+ .dev = {
|
|
|
+ .parent = &pxa25x_device_pwm0.dev,
|
|
|
+ .platform_data = &viper_backlight_data,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+/* Ethernet */
|
|
|
+static struct resource smc91x_resources[] = {
|
|
|
+ [0] = {
|
|
|
+ .name = "smc91x-regs",
|
|
|
+ .start = VIPER_ETH_PHYS + 0x300,
|
|
|
+ .end = VIPER_ETH_PHYS + 0x30f,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ [1] = {
|
|
|
+ .start = PXA_GPIO_TO_IRQ(VIPER_ETH_GPIO),
|
|
|
+ .end = PXA_GPIO_TO_IRQ(VIPER_ETH_GPIO),
|
|
|
+ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
|
|
|
+ },
|
|
|
+ [2] = {
|
|
|
+ .name = "smc91x-data32",
|
|
|
+ .start = VIPER_ETH_DATA_PHYS,
|
|
|
+ .end = VIPER_ETH_DATA_PHYS + 3,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct smc91x_platdata viper_smc91x_info = {
|
|
|
+ .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
|
|
|
+ .leda = RPC_LED_100_10,
|
|
|
+ .ledb = RPC_LED_TX_RX,
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device smc91x_device = {
|
|
|
+ .name = "smc91x",
|
|
|
+ .id = -1,
|
|
|
+ .num_resources = ARRAY_SIZE(smc91x_resources),
|
|
|
+ .resource = smc91x_resources,
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &viper_smc91x_info,
|
|
|
+ },
|