diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/serial/sh-sci.c | 11 | ||||
| -rw-r--r-- | drivers/usb/host/Kconfig | 4 | ||||
| -rw-r--r-- | drivers/video/hitfb.c | 66 | ||||
| -rw-r--r-- | drivers/video/sh_mobile_lcdcfb.c | 40 |
4 files changed, 76 insertions, 45 deletions
diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c index 66f52674ca0c..8e2feb563347 100644 --- a/drivers/serial/sh-sci.c +++ b/drivers/serial/sh-sci.c | |||
| @@ -707,24 +707,25 @@ static irqreturn_t sci_br_interrupt(int irq, void *ptr) | |||
| 707 | 707 | ||
| 708 | static irqreturn_t sci_mpxed_interrupt(int irq, void *ptr) | 708 | static irqreturn_t sci_mpxed_interrupt(int irq, void *ptr) |
| 709 | { | 709 | { |
| 710 | unsigned short ssr_status, scr_status; | 710 | unsigned short ssr_status, scr_status, err_enabled; |
| 711 | struct uart_port *port = ptr; | 711 | struct uart_port *port = ptr; |
| 712 | irqreturn_t ret = IRQ_NONE; | 712 | irqreturn_t ret = IRQ_NONE; |
| 713 | 713 | ||
| 714 | ssr_status = sci_in(port, SCxSR); | 714 | ssr_status = sci_in(port, SCxSR); |
| 715 | scr_status = sci_in(port, SCSCR); | 715 | scr_status = sci_in(port, SCSCR); |
| 716 | err_enabled = scr_status & (SCI_CTRL_FLAGS_REIE | SCI_CTRL_FLAGS_RIE); | ||
| 716 | 717 | ||
| 717 | /* Tx Interrupt */ | 718 | /* Tx Interrupt */ |
| 718 | if ((ssr_status & 0x0020) && (scr_status & SCI_CTRL_FLAGS_TIE)) | 719 | if ((ssr_status & SCxSR_TDxE(port)) && (scr_status & SCI_CTRL_FLAGS_TIE)) |
| 719 | ret = sci_tx_interrupt(irq, ptr); | 720 | ret = sci_tx_interrupt(irq, ptr); |
| 720 | /* Rx Interrupt */ | 721 | /* Rx Interrupt */ |
| 721 | if ((ssr_status & 0x0002) && (scr_status & SCI_CTRL_FLAGS_RIE)) | 722 | if ((ssr_status & SCxSR_RDxF(port)) && (scr_status & SCI_CTRL_FLAGS_RIE)) |
| 722 | ret = sci_rx_interrupt(irq, ptr); | 723 | ret = sci_rx_interrupt(irq, ptr); |
| 723 | /* Error Interrupt */ | 724 | /* Error Interrupt */ |
| 724 | if ((ssr_status & 0x0080) && (scr_status & SCI_CTRL_FLAGS_REIE)) | 725 | if ((ssr_status & SCxSR_ERRORS(port)) && err_enabled) |
| 725 | ret = sci_er_interrupt(irq, ptr); | 726 | ret = sci_er_interrupt(irq, ptr); |
| 726 | /* Break Interrupt */ | 727 | /* Break Interrupt */ |
| 727 | if ((ssr_status & 0x0010) && (scr_status & SCI_CTRL_FLAGS_REIE)) | 728 | if ((ssr_status & SCxSR_BRK(port)) && err_enabled) |
| 728 | ret = sci_br_interrupt(irq, ptr); | 729 | ret = sci_br_interrupt(irq, ptr); |
| 729 | 730 | ||
| 730 | return ret; | 731 | return ret; |
diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index 1576a0520adf..0c03471f0d41 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig | |||
| @@ -337,10 +337,10 @@ config USB_R8A66597_HCD | |||
| 337 | 337 | ||
| 338 | config SUPERH_ON_CHIP_R8A66597 | 338 | config SUPERH_ON_CHIP_R8A66597 |
| 339 | boolean "Enable SuperH on-chip R8A66597 USB" | 339 | boolean "Enable SuperH on-chip R8A66597 USB" |
| 340 | depends on USB_R8A66597_HCD && (CPU_SUBTYPE_SH7366 || CPU_SUBTYPE_SH7723) | 340 | depends on USB_R8A66597_HCD && (CPU_SUBTYPE_SH7366 || CPU_SUBTYPE_SH7723 || CPU_SUBTYPE_SH7724) |
| 341 | help | 341 | help |
| 342 | This driver enables support for the on-chip R8A66597 in the | 342 | This driver enables support for the on-chip R8A66597 in the |
| 343 | SH7366 and SH7723 processors. | 343 | SH7366, SH7723 and SH7724 processors. |
| 344 | 344 | ||
| 345 | config USB_WHCI_HCD | 345 | config USB_WHCI_HCD |
| 346 | tristate "Wireless USB Host Controller Interface (WHCI) driver (EXPERIMENTAL)" | 346 | tristate "Wireless USB Host Controller Interface (WHCI) driver (EXPERIMENTAL)" |
diff --git a/drivers/video/hitfb.c b/drivers/video/hitfb.c index 020db7fc9153..e7116a6d82d3 100644 --- a/drivers/video/hitfb.c +++ b/drivers/video/hitfb.c | |||
| @@ -44,9 +44,6 @@ static struct fb_fix_screeninfo hitfb_fix __initdata = { | |||
| 44 | .accel = FB_ACCEL_NONE, | 44 | .accel = FB_ACCEL_NONE, |
| 45 | }; | 45 | }; |
| 46 | 46 | ||
| 47 | static u32 pseudo_palette[16]; | ||
| 48 | static struct fb_info fb_info; | ||
| 49 | |||
| 50 | static inline void hitfb_accel_wait(void) | 47 | static inline void hitfb_accel_wait(void) |
| 51 | { | 48 | { |
| 52 | while (fb_readw(HD64461_GRCFGR) & HD64461_GRCFGR_ACCSTATUS) ; | 49 | while (fb_readw(HD64461_GRCFGR) & HD64461_GRCFGR_ACCSTATUS) ; |
| @@ -331,6 +328,8 @@ static struct fb_ops hitfb_ops = { | |||
| 331 | static int __init hitfb_probe(struct platform_device *dev) | 328 | static int __init hitfb_probe(struct platform_device *dev) |
| 332 | { | 329 | { |
| 333 | unsigned short lcdclor, ldr3, ldvndr; | 330 | unsigned short lcdclor, ldr3, ldvndr; |
| 331 | struct fb_info *info; | ||
| 332 | int ret; | ||
| 334 | 333 | ||
| 335 | if (fb_get_options("hitfb", NULL)) | 334 | if (fb_get_options("hitfb", NULL)) |
| 336 | return -ENODEV; | 335 | return -ENODEV; |
| @@ -384,32 +383,53 @@ static int __init hitfb_probe(struct platform_device *dev) | |||
| 384 | break; | 383 | break; |
| 385 | } | 384 | } |
| 386 | 385 | ||
| 387 | fb_info.fbops = &hitfb_ops; | 386 | info = framebuffer_alloc(sizeof(u32) * 16, &dev->dev); |
| 388 | fb_info.var = hitfb_var; | 387 | if (unlikely(!info)) |
| 389 | fb_info.fix = hitfb_fix; | 388 | return -ENOMEM; |
| 390 | fb_info.pseudo_palette = pseudo_palette; | 389 | |
| 391 | fb_info.flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN | | 390 | info->fbops = &hitfb_ops; |
| 391 | info->var = hitfb_var; | ||
| 392 | info->fix = hitfb_fix; | ||
| 393 | info->pseudo_palette = info->par; | ||
| 394 | info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN | | ||
| 392 | FBINFO_HWACCEL_FILLRECT | FBINFO_HWACCEL_COPYAREA; | 395 | FBINFO_HWACCEL_FILLRECT | FBINFO_HWACCEL_COPYAREA; |
| 393 | 396 | ||
| 394 | fb_info.screen_base = (void *)hitfb_fix.smem_start; | 397 | info->screen_base = (void *)hitfb_fix.smem_start; |
| 395 | 398 | ||
| 396 | fb_alloc_cmap(&fb_info.cmap, 256, 0); | 399 | ret = fb_alloc_cmap(&info->cmap, 256, 0); |
| 400 | if (unlikely(ret < 0)) | ||
| 401 | goto err_fb; | ||
| 397 | 402 | ||
| 398 | if (register_framebuffer(&fb_info) < 0) | 403 | ret = register_framebuffer(info); |
| 399 | return -EINVAL; | 404 | if (unlikely(ret < 0)) |
| 405 | goto err; | ||
| 406 | |||
| 407 | platform_set_drvdata(dev, info); | ||
| 400 | 408 | ||
| 401 | printk(KERN_INFO "fb%d: %s frame buffer device\n", | 409 | printk(KERN_INFO "fb%d: %s frame buffer device\n", |
| 402 | fb_info.node, fb_info.fix.id); | 410 | info->node, info->fix.id); |
| 411 | |||
| 403 | return 0; | 412 | return 0; |
| 413 | |||
| 414 | err: | ||
| 415 | fb_dealloc_cmap(&info->cmap); | ||
| 416 | err_fb: | ||
| 417 | framebuffer_release(info); | ||
| 418 | return ret; | ||
| 404 | } | 419 | } |
| 405 | 420 | ||
| 406 | static int __exit hitfb_remove(struct platform_device *dev) | 421 | static int __exit hitfb_remove(struct platform_device *dev) |
| 407 | { | 422 | { |
| 408 | return unregister_framebuffer(&fb_info); | 423 | struct fb_info *info = platform_get_drvdata(dev); |
| 424 | |||
| 425 | unregister_framebuffer(info); | ||
| 426 | fb_dealloc_cmap(&info->cmap); | ||
| 427 | framebuffer_release(info); | ||
| 428 | |||
| 429 | return 0; | ||
| 409 | } | 430 | } |
| 410 | 431 | ||
| 411 | #ifdef CONFIG_PM | 432 | static int hitfb_suspend(struct device *dev) |
| 412 | static int hitfb_suspend(struct platform_device *dev, pm_message_t state) | ||
| 413 | { | 433 | { |
| 414 | u16 v; | 434 | u16 v; |
| 415 | 435 | ||
| @@ -421,7 +441,7 @@ static int hitfb_suspend(struct platform_device *dev, pm_message_t state) | |||
| 421 | return 0; | 441 | return 0; |
| 422 | } | 442 | } |
| 423 | 443 | ||
| 424 | static int hitfb_resume(struct platform_device *dev) | 444 | static int hitfb_resume(struct device *dev) |
| 425 | { | 445 | { |
| 426 | u16 v; | 446 | u16 v; |
| 427 | 447 | ||
| @@ -435,17 +455,19 @@ static int hitfb_resume(struct platform_device *dev) | |||
| 435 | 455 | ||
| 436 | return 0; | 456 | return 0; |
| 437 | } | 457 | } |
| 438 | #endif | 458 | |
| 459 | static struct dev_pm_ops hitfb_dev_pm_ops = { | ||
| 460 | .suspend = hitfb_suspend, | ||
| 461 | .resume = hitfb_resume, | ||
| 462 | }; | ||
| 439 | 463 | ||
| 440 | static struct platform_driver hitfb_driver = { | 464 | static struct platform_driver hitfb_driver = { |
| 441 | .probe = hitfb_probe, | 465 | .probe = hitfb_probe, |
| 442 | .remove = __exit_p(hitfb_remove), | 466 | .remove = __exit_p(hitfb_remove), |
| 443 | #ifdef CONFIG_PM | ||
| 444 | .suspend = hitfb_suspend, | ||
| 445 | .resume = hitfb_resume, | ||
| 446 | #endif | ||
| 447 | .driver = { | 467 | .driver = { |
| 448 | .name = "hitfb", | 468 | .name = "hitfb", |
| 469 | .owner = THIS_MODULE, | ||
| 470 | .pm = &hitfb_dev_pm_ops, | ||
| 449 | }, | 471 | }, |
| 450 | }; | 472 | }; |
| 451 | 473 | ||
diff --git a/drivers/video/sh_mobile_lcdcfb.c b/drivers/video/sh_mobile_lcdcfb.c index da983b720f08..8f24564f77b0 100644 --- a/drivers/video/sh_mobile_lcdcfb.c +++ b/drivers/video/sh_mobile_lcdcfb.c | |||
| @@ -31,7 +31,7 @@ struct sh_mobile_lcdc_chan { | |||
| 31 | unsigned long enabled; /* ME and SE in LDCNT2R */ | 31 | unsigned long enabled; /* ME and SE in LDCNT2R */ |
| 32 | struct sh_mobile_lcdc_chan_cfg cfg; | 32 | struct sh_mobile_lcdc_chan_cfg cfg; |
| 33 | u32 pseudo_palette[PALETTE_NR]; | 33 | u32 pseudo_palette[PALETTE_NR]; |
| 34 | struct fb_info info; | 34 | struct fb_info *info; |
| 35 | dma_addr_t dma_handle; | 35 | dma_addr_t dma_handle; |
| 36 | struct fb_deferred_io defio; | 36 | struct fb_deferred_io defio; |
| 37 | struct scatterlist *sglist; | 37 | struct scatterlist *sglist; |
| @@ -442,22 +442,22 @@ static int sh_mobile_lcdc_start(struct sh_mobile_lcdc_priv *priv) | |||
| 442 | /* set bpp format in PKF[4:0] */ | 442 | /* set bpp format in PKF[4:0] */ |
| 443 | tmp = lcdc_read_chan(ch, LDDFR); | 443 | tmp = lcdc_read_chan(ch, LDDFR); |
| 444 | tmp &= ~(0x0001001f); | 444 | tmp &= ~(0x0001001f); |
| 445 | tmp |= (priv->ch[k].info.var.bits_per_pixel == 16) ? 3 : 0; | 445 | tmp |= (ch->info->var.bits_per_pixel == 16) ? 3 : 0; |
| 446 | lcdc_write_chan(ch, LDDFR, tmp); | 446 | lcdc_write_chan(ch, LDDFR, tmp); |
| 447 | 447 | ||
| 448 | /* point out our frame buffer */ | 448 | /* point out our frame buffer */ |
| 449 | lcdc_write_chan(ch, LDSA1R, ch->info.fix.smem_start); | 449 | lcdc_write_chan(ch, LDSA1R, ch->info->fix.smem_start); |
| 450 | 450 | ||
| 451 | /* set line size */ | 451 | /* set line size */ |
| 452 | lcdc_write_chan(ch, LDMLSR, ch->info.fix.line_length); | 452 | lcdc_write_chan(ch, LDMLSR, ch->info->fix.line_length); |
| 453 | 453 | ||
| 454 | /* setup deferred io if SYS bus */ | 454 | /* setup deferred io if SYS bus */ |
| 455 | tmp = ch->cfg.sys_bus_cfg.deferred_io_msec; | 455 | tmp = ch->cfg.sys_bus_cfg.deferred_io_msec; |
| 456 | if (ch->ldmt1r_value & (1 << 12) && tmp) { | 456 | if (ch->ldmt1r_value & (1 << 12) && tmp) { |
| 457 | ch->defio.deferred_io = sh_mobile_lcdc_deferred_io; | 457 | ch->defio.deferred_io = sh_mobile_lcdc_deferred_io; |
| 458 | ch->defio.delay = msecs_to_jiffies(tmp); | 458 | ch->defio.delay = msecs_to_jiffies(tmp); |
| 459 | ch->info.fbdefio = &ch->defio; | 459 | ch->info->fbdefio = &ch->defio; |
| 460 | fb_deferred_io_init(&ch->info); | 460 | fb_deferred_io_init(ch->info); |
| 461 | 461 | ||
| 462 | /* one-shot mode */ | 462 | /* one-shot mode */ |
| 463 | lcdc_write_chan(ch, LDSM1R, 1); | 463 | lcdc_write_chan(ch, LDSM1R, 1); |
| @@ -503,12 +503,12 @@ static void sh_mobile_lcdc_stop(struct sh_mobile_lcdc_priv *priv) | |||
| 503 | * flush frame, and wait for frame end interrupt | 503 | * flush frame, and wait for frame end interrupt |
| 504 | * clean up deferred io and enable clock | 504 | * clean up deferred io and enable clock |
| 505 | */ | 505 | */ |
| 506 | if (ch->info.fbdefio) { | 506 | if (ch->info->fbdefio) { |
| 507 | ch->frame_end = 0; | 507 | ch->frame_end = 0; |
| 508 | schedule_delayed_work(&ch->info.deferred_work, 0); | 508 | schedule_delayed_work(&ch->info->deferred_work, 0); |
| 509 | wait_event(ch->frame_end_wait, ch->frame_end); | 509 | wait_event(ch->frame_end_wait, ch->frame_end); |
| 510 | fb_deferred_io_cleanup(&ch->info); | 510 | fb_deferred_io_cleanup(ch->info); |
| 511 | ch->info.fbdefio = NULL; | 511 | ch->info->fbdefio = NULL; |
| 512 | sh_mobile_lcdc_clk_on(priv); | 512 | sh_mobile_lcdc_clk_on(priv); |
| 513 | } | 513 | } |
| 514 | 514 | ||
| @@ -817,9 +817,16 @@ static int __init sh_mobile_lcdc_probe(struct platform_device *pdev) | |||
| 817 | priv->base = ioremap_nocache(res->start, (res->end - res->start) + 1); | 817 | priv->base = ioremap_nocache(res->start, (res->end - res->start) + 1); |
| 818 | 818 | ||
| 819 | for (i = 0; i < j; i++) { | 819 | for (i = 0; i < j; i++) { |
| 820 | info = &priv->ch[i].info; | ||
| 821 | cfg = &priv->ch[i].cfg; | 820 | cfg = &priv->ch[i].cfg; |
| 822 | 821 | ||
| 822 | priv->ch[i].info = framebuffer_alloc(0, &pdev->dev); | ||
| 823 | if (!priv->ch[i].info) { | ||
| 824 | dev_err(&pdev->dev, "unable to allocate fb_info\n"); | ||
| 825 | error = -ENOMEM; | ||
| 826 | break; | ||
| 827 | } | ||
| 828 | |||
| 829 | info = priv->ch[i].info; | ||
| 823 | info->fbops = &sh_mobile_lcdc_ops; | 830 | info->fbops = &sh_mobile_lcdc_ops; |
| 824 | info->var.xres = info->var.xres_virtual = cfg->lcd_cfg.xres; | 831 | info->var.xres = info->var.xres_virtual = cfg->lcd_cfg.xres; |
| 825 | info->var.yres = info->var.yres_virtual = cfg->lcd_cfg.yres; | 832 | info->var.yres = info->var.yres_virtual = cfg->lcd_cfg.yres; |
| @@ -872,7 +879,7 @@ static int __init sh_mobile_lcdc_probe(struct platform_device *pdev) | |||
| 872 | for (i = 0; i < j; i++) { | 879 | for (i = 0; i < j; i++) { |
| 873 | struct sh_mobile_lcdc_chan *ch = priv->ch + i; | 880 | struct sh_mobile_lcdc_chan *ch = priv->ch + i; |
| 874 | 881 | ||
| 875 | info = &ch->info; | 882 | info = ch->info; |
| 876 | 883 | ||
| 877 | if (info->fbdefio) { | 884 | if (info->fbdefio) { |
| 878 | priv->ch->sglist = vmalloc(sizeof(struct scatterlist) * | 885 | priv->ch->sglist = vmalloc(sizeof(struct scatterlist) * |
| @@ -915,15 +922,15 @@ static int sh_mobile_lcdc_remove(struct platform_device *pdev) | |||
| 915 | int i; | 922 | int i; |
| 916 | 923 | ||
| 917 | for (i = 0; i < ARRAY_SIZE(priv->ch); i++) | 924 | for (i = 0; i < ARRAY_SIZE(priv->ch); i++) |
| 918 | if (priv->ch[i].info.dev) | 925 | if (priv->ch[i].info->dev) |
| 919 | unregister_framebuffer(&priv->ch[i].info); | 926 | unregister_framebuffer(priv->ch[i].info); |
| 920 | 927 | ||
| 921 | sh_mobile_lcdc_stop(priv); | 928 | sh_mobile_lcdc_stop(priv); |
| 922 | 929 | ||
| 923 | for (i = 0; i < ARRAY_SIZE(priv->ch); i++) { | 930 | for (i = 0; i < ARRAY_SIZE(priv->ch); i++) { |
| 924 | info = &priv->ch[i].info; | 931 | info = priv->ch[i].info; |
| 925 | 932 | ||
| 926 | if (!info->device) | 933 | if (!info || !info->device) |
| 927 | continue; | 934 | continue; |
| 928 | 935 | ||
| 929 | if (priv->ch[i].sglist) | 936 | if (priv->ch[i].sglist) |
| @@ -932,6 +939,7 @@ static int sh_mobile_lcdc_remove(struct platform_device *pdev) | |||
| 932 | dma_free_coherent(&pdev->dev, info->fix.smem_len, | 939 | dma_free_coherent(&pdev->dev, info->fix.smem_len, |
| 933 | info->screen_base, priv->ch[i].dma_handle); | 940 | info->screen_base, priv->ch[i].dma_handle); |
| 934 | fb_dealloc_cmap(&info->cmap); | 941 | fb_dealloc_cmap(&info->cmap); |
| 942 | framebuffer_release(info); | ||
| 935 | } | 943 | } |
| 936 | 944 | ||
| 937 | #ifdef CONFIG_HAVE_CLK | 945 | #ifdef CONFIG_HAVE_CLK |
