diff options
Diffstat (limited to 'drivers')
49 files changed, 1080 insertions, 247 deletions
diff --git a/drivers/block/DAC960.c b/drivers/block/DAC960.c index e086fbbbe85..8db9089127c 100644 --- a/drivers/block/DAC960.c +++ b/drivers/block/DAC960.c | |||
@@ -1177,7 +1177,8 @@ static bool DAC960_V1_EnableMemoryMailboxInterface(DAC960_Controller_T | |||
1177 | int TimeoutCounter; | 1177 | int TimeoutCounter; |
1178 | int i; | 1178 | int i; |
1179 | 1179 | ||
1180 | 1180 | memset(&CommandMailbox, 0, sizeof(DAC960_V1_CommandMailbox_T)); | |
1181 | |||
1181 | if (pci_set_dma_mask(Controller->PCIDevice, DMA_BIT_MASK(32))) | 1182 | if (pci_set_dma_mask(Controller->PCIDevice, DMA_BIT_MASK(32))) |
1182 | return DAC960_Failure(Controller, "DMA mask out of range"); | 1183 | return DAC960_Failure(Controller, "DMA mask out of range"); |
1183 | Controller->BounceBufferLimit = DMA_BIT_MASK(32); | 1184 | Controller->BounceBufferLimit = DMA_BIT_MASK(32); |
@@ -4627,7 +4628,8 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command) | |||
4627 | DAC960_Controller_T *Controller = Command->Controller; | 4628 | DAC960_Controller_T *Controller = Command->Controller; |
4628 | DAC960_CommandType_T CommandType = Command->CommandType; | 4629 | DAC960_CommandType_T CommandType = Command->CommandType; |
4629 | DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; | 4630 | DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; |
4630 | DAC960_V2_IOCTL_Opcode_T CommandOpcode = CommandMailbox->Common.IOCTL_Opcode; | 4631 | DAC960_V2_IOCTL_Opcode_T IOCTLOpcode = CommandMailbox->Common.IOCTL_Opcode; |
4632 | DAC960_V2_CommandOpcode_T CommandOpcode = CommandMailbox->SCSI_10.CommandOpcode; | ||
4631 | DAC960_V2_CommandStatus_T CommandStatus = Command->V2.CommandStatus; | 4633 | DAC960_V2_CommandStatus_T CommandStatus = Command->V2.CommandStatus; |
4632 | 4634 | ||
4633 | if (CommandType == DAC960_ReadCommand || | 4635 | if (CommandType == DAC960_ReadCommand || |
@@ -4699,7 +4701,7 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command) | |||
4699 | { | 4701 | { |
4700 | if (Controller->ShutdownMonitoringTimer) | 4702 | if (Controller->ShutdownMonitoringTimer) |
4701 | return; | 4703 | return; |
4702 | if (CommandOpcode == DAC960_V2_GetControllerInfo) | 4704 | if (IOCTLOpcode == DAC960_V2_GetControllerInfo) |
4703 | { | 4705 | { |
4704 | DAC960_V2_ControllerInfo_T *NewControllerInfo = | 4706 | DAC960_V2_ControllerInfo_T *NewControllerInfo = |
4705 | Controller->V2.NewControllerInformation; | 4707 | Controller->V2.NewControllerInformation; |
@@ -4719,14 +4721,14 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command) | |||
4719 | memcpy(ControllerInfo, NewControllerInfo, | 4721 | memcpy(ControllerInfo, NewControllerInfo, |
4720 | sizeof(DAC960_V2_ControllerInfo_T)); | 4722 | sizeof(DAC960_V2_ControllerInfo_T)); |
4721 | } | 4723 | } |
4722 | else if (CommandOpcode == DAC960_V2_GetEvent) | 4724 | else if (IOCTLOpcode == DAC960_V2_GetEvent) |
4723 | { | 4725 | { |
4724 | if (CommandStatus == DAC960_V2_NormalCompletion) { | 4726 | if (CommandStatus == DAC960_V2_NormalCompletion) { |
4725 | DAC960_V2_ReportEvent(Controller, Controller->V2.Event); | 4727 | DAC960_V2_ReportEvent(Controller, Controller->V2.Event); |
4726 | } | 4728 | } |
4727 | Controller->V2.NextEventSequenceNumber++; | 4729 | Controller->V2.NextEventSequenceNumber++; |
4728 | } | 4730 | } |
4729 | else if (CommandOpcode == DAC960_V2_GetPhysicalDeviceInfoValid && | 4731 | else if (IOCTLOpcode == DAC960_V2_GetPhysicalDeviceInfoValid && |
4730 | CommandStatus == DAC960_V2_NormalCompletion) | 4732 | CommandStatus == DAC960_V2_NormalCompletion) |
4731 | { | 4733 | { |
4732 | DAC960_V2_PhysicalDeviceInfo_T *NewPhysicalDeviceInfo = | 4734 | DAC960_V2_PhysicalDeviceInfo_T *NewPhysicalDeviceInfo = |
@@ -4915,7 +4917,7 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command) | |||
4915 | NewPhysicalDeviceInfo->LogicalUnit++; | 4917 | NewPhysicalDeviceInfo->LogicalUnit++; |
4916 | Controller->V2.PhysicalDeviceIndex++; | 4918 | Controller->V2.PhysicalDeviceIndex++; |
4917 | } | 4919 | } |
4918 | else if (CommandOpcode == DAC960_V2_GetPhysicalDeviceInfoValid) | 4920 | else if (IOCTLOpcode == DAC960_V2_GetPhysicalDeviceInfoValid) |
4919 | { | 4921 | { |
4920 | unsigned int DeviceIndex; | 4922 | unsigned int DeviceIndex; |
4921 | for (DeviceIndex = Controller->V2.PhysicalDeviceIndex; | 4923 | for (DeviceIndex = Controller->V2.PhysicalDeviceIndex; |
@@ -4938,7 +4940,7 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command) | |||
4938 | } | 4940 | } |
4939 | Controller->V2.NeedPhysicalDeviceInformation = false; | 4941 | Controller->V2.NeedPhysicalDeviceInformation = false; |
4940 | } | 4942 | } |
4941 | else if (CommandOpcode == DAC960_V2_GetLogicalDeviceInfoValid && | 4943 | else if (IOCTLOpcode == DAC960_V2_GetLogicalDeviceInfoValid && |
4942 | CommandStatus == DAC960_V2_NormalCompletion) | 4944 | CommandStatus == DAC960_V2_NormalCompletion) |
4943 | { | 4945 | { |
4944 | DAC960_V2_LogicalDeviceInfo_T *NewLogicalDeviceInfo = | 4946 | DAC960_V2_LogicalDeviceInfo_T *NewLogicalDeviceInfo = |
@@ -5065,7 +5067,7 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command) | |||
5065 | [LogicalDeviceNumber] = true; | 5067 | [LogicalDeviceNumber] = true; |
5066 | NewLogicalDeviceInfo->LogicalDeviceNumber++; | 5068 | NewLogicalDeviceInfo->LogicalDeviceNumber++; |
5067 | } | 5069 | } |
5068 | else if (CommandOpcode == DAC960_V2_GetLogicalDeviceInfoValid) | 5070 | else if (IOCTLOpcode == DAC960_V2_GetLogicalDeviceInfoValid) |
5069 | { | 5071 | { |
5070 | int LogicalDriveNumber; | 5072 | int LogicalDriveNumber; |
5071 | for (LogicalDriveNumber = 0; | 5073 | for (LogicalDriveNumber = 0; |
diff --git a/drivers/block/sx8.c b/drivers/block/sx8.c index e7472f567c9..3fb6ab4c8b4 100644 --- a/drivers/block/sx8.c +++ b/drivers/block/sx8.c | |||
@@ -1120,7 +1120,7 @@ static inline void carm_handle_resp(struct carm_host *host, | |||
1120 | break; | 1120 | break; |
1121 | case MISC_GET_FW_VER: { | 1121 | case MISC_GET_FW_VER: { |
1122 | struct carm_fw_ver *ver = (struct carm_fw_ver *) | 1122 | struct carm_fw_ver *ver = (struct carm_fw_ver *) |
1123 | mem + sizeof(struct carm_msg_get_fw_ver); | 1123 | (mem + sizeof(struct carm_msg_get_fw_ver)); |
1124 | if (!error) { | 1124 | if (!error) { |
1125 | host->fw_ver = le32_to_cpu(ver->version); | 1125 | host->fw_ver = le32_to_cpu(ver->version); |
1126 | host->flags |= (ver->features & FL_FW_VER_MASK); | 1126 | host->flags |= (ver->features & FL_FW_VER_MASK); |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_connector.c b/drivers/gpu/drm/exynos/exynos_drm_connector.c index 618bd4d87d2..99d5527b2ca 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_connector.c +++ b/drivers/gpu/drm/exynos/exynos_drm_connector.c | |||
@@ -54,14 +54,14 @@ convert_to_display_mode(struct drm_display_mode *mode, | |||
54 | mode->vrefresh = timing->refresh; | 54 | mode->vrefresh = timing->refresh; |
55 | 55 | ||
56 | mode->hdisplay = timing->xres; | 56 | mode->hdisplay = timing->xres; |
57 | mode->hsync_start = mode->hdisplay + timing->left_margin; | 57 | mode->hsync_start = mode->hdisplay + timing->right_margin; |
58 | mode->hsync_end = mode->hsync_start + timing->hsync_len; | 58 | mode->hsync_end = mode->hsync_start + timing->hsync_len; |
59 | mode->htotal = mode->hsync_end + timing->right_margin; | 59 | mode->htotal = mode->hsync_end + timing->left_margin; |
60 | 60 | ||
61 | mode->vdisplay = timing->yres; | 61 | mode->vdisplay = timing->yres; |
62 | mode->vsync_start = mode->vdisplay + timing->upper_margin; | 62 | mode->vsync_start = mode->vdisplay + timing->lower_margin; |
63 | mode->vsync_end = mode->vsync_start + timing->vsync_len; | 63 | mode->vsync_end = mode->vsync_start + timing->vsync_len; |
64 | mode->vtotal = mode->vsync_end + timing->lower_margin; | 64 | mode->vtotal = mode->vsync_end + timing->upper_margin; |
65 | mode->width_mm = panel->width_mm; | 65 | mode->width_mm = panel->width_mm; |
66 | mode->height_mm = panel->height_mm; | 66 | mode->height_mm = panel->height_mm; |
67 | 67 | ||
@@ -85,14 +85,14 @@ convert_to_video_timing(struct fb_videomode *timing, | |||
85 | timing->refresh = drm_mode_vrefresh(mode); | 85 | timing->refresh = drm_mode_vrefresh(mode); |
86 | 86 | ||
87 | timing->xres = mode->hdisplay; | 87 | timing->xres = mode->hdisplay; |
88 | timing->left_margin = mode->hsync_start - mode->hdisplay; | 88 | timing->right_margin = mode->hsync_start - mode->hdisplay; |
89 | timing->hsync_len = mode->hsync_end - mode->hsync_start; | 89 | timing->hsync_len = mode->hsync_end - mode->hsync_start; |
90 | timing->right_margin = mode->htotal - mode->hsync_end; | 90 | timing->left_margin = mode->htotal - mode->hsync_end; |
91 | 91 | ||
92 | timing->yres = mode->vdisplay; | 92 | timing->yres = mode->vdisplay; |
93 | timing->upper_margin = mode->vsync_start - mode->vdisplay; | 93 | timing->lower_margin = mode->vsync_start - mode->vdisplay; |
94 | timing->vsync_len = mode->vsync_end - mode->vsync_start; | 94 | timing->vsync_len = mode->vsync_end - mode->vsync_start; |
95 | timing->lower_margin = mode->vtotal - mode->vsync_end; | 95 | timing->upper_margin = mode->vtotal - mode->vsync_end; |
96 | 96 | ||
97 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) | 97 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) |
98 | timing->vmode = FB_VMODE_INTERLACED; | 98 | timing->vmode = FB_VMODE_INTERLACED; |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index 58820ebd355..09cc13f791b 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c | |||
@@ -246,7 +246,7 @@ static struct platform_driver exynos_drm_platform_driver = { | |||
246 | .remove = __devexit_p(exynos_drm_platform_remove), | 246 | .remove = __devexit_p(exynos_drm_platform_remove), |
247 | .driver = { | 247 | .driver = { |
248 | .owner = THIS_MODULE, | 248 | .owner = THIS_MODULE, |
249 | .name = DRIVER_NAME, | 249 | .name = "exynos-drm", |
250 | }, | 250 | }, |
251 | }; | 251 | }; |
252 | 252 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c index 3508700e529..54f8f074822 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c | |||
@@ -46,39 +46,13 @@ struct exynos_drm_fbdev { | |||
46 | struct exynos_drm_gem_obj *exynos_gem_obj; | 46 | struct exynos_drm_gem_obj *exynos_gem_obj; |
47 | }; | 47 | }; |
48 | 48 | ||
49 | static int exynos_drm_fbdev_set_par(struct fb_info *info) | ||
50 | { | ||
51 | struct fb_var_screeninfo *var = &info->var; | ||
52 | |||
53 | switch (var->bits_per_pixel) { | ||
54 | case 32: | ||
55 | case 24: | ||
56 | case 18: | ||
57 | case 16: | ||
58 | case 12: | ||
59 | info->fix.visual = FB_VISUAL_TRUECOLOR; | ||
60 | break; | ||
61 | case 1: | ||
62 | info->fix.visual = FB_VISUAL_MONO01; | ||
63 | break; | ||
64 | default: | ||
65 | info->fix.visual = FB_VISUAL_PSEUDOCOLOR; | ||
66 | break; | ||
67 | } | ||
68 | |||
69 | info->fix.line_length = (var->xres_virtual * var->bits_per_pixel) / 8; | ||
70 | |||
71 | return drm_fb_helper_set_par(info); | ||
72 | } | ||
73 | |||
74 | |||
75 | static struct fb_ops exynos_drm_fb_ops = { | 49 | static struct fb_ops exynos_drm_fb_ops = { |
76 | .owner = THIS_MODULE, | 50 | .owner = THIS_MODULE, |
77 | .fb_fillrect = cfb_fillrect, | 51 | .fb_fillrect = cfb_fillrect, |
78 | .fb_copyarea = cfb_copyarea, | 52 | .fb_copyarea = cfb_copyarea, |
79 | .fb_imageblit = cfb_imageblit, | 53 | .fb_imageblit = cfb_imageblit, |
80 | .fb_check_var = drm_fb_helper_check_var, | 54 | .fb_check_var = drm_fb_helper_check_var, |
81 | .fb_set_par = exynos_drm_fbdev_set_par, | 55 | .fb_set_par = drm_fb_helper_set_par, |
82 | .fb_blank = drm_fb_helper_blank, | 56 | .fb_blank = drm_fb_helper_blank, |
83 | .fb_pan_display = drm_fb_helper_pan_display, | 57 | .fb_pan_display = drm_fb_helper_pan_display, |
84 | .fb_setcmap = drm_fb_helper_setcmap, | 58 | .fb_setcmap = drm_fb_helper_setcmap, |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 360adf2bba0..56458eea050 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c | |||
@@ -817,8 +817,6 @@ static int __devinit fimd_probe(struct platform_device *pdev) | |||
817 | goto err_clk_get; | 817 | goto err_clk_get; |
818 | } | 818 | } |
819 | 819 | ||
820 | clk_enable(ctx->bus_clk); | ||
821 | |||
822 | ctx->lcd_clk = clk_get(dev, "sclk_fimd"); | 820 | ctx->lcd_clk = clk_get(dev, "sclk_fimd"); |
823 | if (IS_ERR(ctx->lcd_clk)) { | 821 | if (IS_ERR(ctx->lcd_clk)) { |
824 | dev_err(dev, "failed to get lcd clock\n"); | 822 | dev_err(dev, "failed to get lcd clock\n"); |
@@ -826,8 +824,6 @@ static int __devinit fimd_probe(struct platform_device *pdev) | |||
826 | goto err_bus_clk; | 824 | goto err_bus_clk; |
827 | } | 825 | } |
828 | 826 | ||
829 | clk_enable(ctx->lcd_clk); | ||
830 | |||
831 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 827 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
832 | if (!res) { | 828 | if (!res) { |
833 | dev_err(dev, "failed to find registers\n"); | 829 | dev_err(dev, "failed to find registers\n"); |
@@ -864,17 +860,11 @@ static int __devinit fimd_probe(struct platform_device *pdev) | |||
864 | goto err_req_irq; | 860 | goto err_req_irq; |
865 | } | 861 | } |
866 | 862 | ||
867 | ctx->clkdiv = fimd_calc_clkdiv(ctx, &panel->timing); | ||
868 | ctx->vidcon0 = pdata->vidcon0; | 863 | ctx->vidcon0 = pdata->vidcon0; |
869 | ctx->vidcon1 = pdata->vidcon1; | 864 | ctx->vidcon1 = pdata->vidcon1; |
870 | ctx->default_win = pdata->default_win; | 865 | ctx->default_win = pdata->default_win; |
871 | ctx->panel = panel; | 866 | ctx->panel = panel; |
872 | 867 | ||
873 | panel->timing.pixclock = clk_get_rate(ctx->lcd_clk) / ctx->clkdiv; | ||
874 | |||
875 | DRM_DEBUG_KMS("pixel clock = %d, clkdiv = %d\n", | ||
876 | panel->timing.pixclock, ctx->clkdiv); | ||
877 | |||
878 | subdrv = &ctx->subdrv; | 868 | subdrv = &ctx->subdrv; |
879 | 869 | ||
880 | subdrv->probe = fimd_subdrv_probe; | 870 | subdrv->probe = fimd_subdrv_probe; |
@@ -889,10 +879,15 @@ static int __devinit fimd_probe(struct platform_device *pdev) | |||
889 | 879 | ||
890 | platform_set_drvdata(pdev, ctx); | 880 | platform_set_drvdata(pdev, ctx); |
891 | 881 | ||
892 | pm_runtime_set_active(dev); | ||
893 | pm_runtime_enable(dev); | 882 | pm_runtime_enable(dev); |
894 | pm_runtime_get_sync(dev); | 883 | pm_runtime_get_sync(dev); |
895 | 884 | ||
885 | ctx->clkdiv = fimd_calc_clkdiv(ctx, &panel->timing); | ||
886 | panel->timing.pixclock = clk_get_rate(ctx->lcd_clk) / ctx->clkdiv; | ||
887 | |||
888 | DRM_DEBUG_KMS("pixel clock = %d, clkdiv = %d\n", | ||
889 | panel->timing.pixclock, ctx->clkdiv); | ||
890 | |||
896 | for (win = 0; win < WINDOWS_NR; win++) | 891 | for (win = 0; win < WINDOWS_NR; win++) |
897 | fimd_clear_win(ctx, win); | 892 | fimd_clear_win(ctx, win); |
898 | 893 | ||
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 03c53fcf865..558ac716a32 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -2689,7 +2689,7 @@ | |||
2689 | #define DVS_FORMAT_RGBX888 (2<<25) | 2689 | #define DVS_FORMAT_RGBX888 (2<<25) |
2690 | #define DVS_FORMAT_RGBX161616 (3<<25) | 2690 | #define DVS_FORMAT_RGBX161616 (3<<25) |
2691 | #define DVS_SOURCE_KEY (1<<22) | 2691 | #define DVS_SOURCE_KEY (1<<22) |
2692 | #define DVS_RGB_ORDER_RGBX (1<<20) | 2692 | #define DVS_RGB_ORDER_XBGR (1<<20) |
2693 | #define DVS_YUV_BYTE_ORDER_MASK (3<<16) | 2693 | #define DVS_YUV_BYTE_ORDER_MASK (3<<16) |
2694 | #define DVS_YUV_ORDER_YUYV (0<<16) | 2694 | #define DVS_YUV_ORDER_YUYV (0<<16) |
2695 | #define DVS_YUV_ORDER_UYVY (1<<16) | 2695 | #define DVS_YUV_ORDER_UYVY (1<<16) |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index f851db7be2c..397087cf689 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -7828,6 +7828,7 @@ int intel_framebuffer_init(struct drm_device *dev, | |||
7828 | case DRM_FORMAT_RGB332: | 7828 | case DRM_FORMAT_RGB332: |
7829 | case DRM_FORMAT_RGB565: | 7829 | case DRM_FORMAT_RGB565: |
7830 | case DRM_FORMAT_XRGB8888: | 7830 | case DRM_FORMAT_XRGB8888: |
7831 | case DRM_FORMAT_XBGR8888: | ||
7831 | case DRM_FORMAT_ARGB8888: | 7832 | case DRM_FORMAT_ARGB8888: |
7832 | case DRM_FORMAT_XRGB2101010: | 7833 | case DRM_FORMAT_XRGB2101010: |
7833 | case DRM_FORMAT_ARGB2101010: | 7834 | case DRM_FORMAT_ARGB2101010: |
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c index 2288abf88cc..a0835040c86 100644 --- a/drivers/gpu/drm/i915/intel_sprite.c +++ b/drivers/gpu/drm/i915/intel_sprite.c | |||
@@ -225,16 +225,16 @@ snb_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb, | |||
225 | 225 | ||
226 | /* Mask out pixel format bits in case we change it */ | 226 | /* Mask out pixel format bits in case we change it */ |
227 | dvscntr &= ~DVS_PIXFORMAT_MASK; | 227 | dvscntr &= ~DVS_PIXFORMAT_MASK; |
228 | dvscntr &= ~DVS_RGB_ORDER_RGBX; | 228 | dvscntr &= ~DVS_RGB_ORDER_XBGR; |
229 | dvscntr &= ~DVS_YUV_BYTE_ORDER_MASK; | 229 | dvscntr &= ~DVS_YUV_BYTE_ORDER_MASK; |
230 | 230 | ||
231 | switch (fb->pixel_format) { | 231 | switch (fb->pixel_format) { |
232 | case DRM_FORMAT_XBGR8888: | 232 | case DRM_FORMAT_XBGR8888: |
233 | dvscntr |= DVS_FORMAT_RGBX888; | 233 | dvscntr |= DVS_FORMAT_RGBX888 | DVS_RGB_ORDER_XBGR; |
234 | pixel_size = 4; | 234 | pixel_size = 4; |
235 | break; | 235 | break; |
236 | case DRM_FORMAT_XRGB8888: | 236 | case DRM_FORMAT_XRGB8888: |
237 | dvscntr |= DVS_FORMAT_RGBX888 | DVS_RGB_ORDER_RGBX; | 237 | dvscntr |= DVS_FORMAT_RGBX888; |
238 | pixel_size = 4; | 238 | pixel_size = 4; |
239 | break; | 239 | break; |
240 | case DRM_FORMAT_YUYV: | 240 | case DRM_FORMAT_YUYV: |
diff --git a/drivers/hwmon/pmbus/zl6100.c b/drivers/hwmon/pmbus/zl6100.c index 880b90cf4d3..e3e8420b7b8 100644 --- a/drivers/hwmon/pmbus/zl6100.c +++ b/drivers/hwmon/pmbus/zl6100.c | |||
@@ -200,17 +200,11 @@ static int zl6100_probe(struct i2c_client *client, | |||
200 | data->id = mid->driver_data; | 200 | data->id = mid->driver_data; |
201 | 201 | ||
202 | /* | 202 | /* |
203 | * ZL2005, ZL2008, ZL2105, and ZL6100 are known to require a wait time | 203 | * According to information from the chip vendor, all currently |
204 | * between I2C accesses. ZL2004 and ZL6105 are known to be safe. | 204 | * supported chips are known to require a wait time between I2C |
205 | * Other chips have not yet been tested. | 205 | * accesses. |
206 | * | ||
207 | * Only clear the wait time for chips known to be safe. The wait time | ||
208 | * can be cleared later for additional chips if tests show that it | ||
209 | * is not needed (in other words, better be safe than sorry). | ||
210 | */ | 206 | */ |
211 | data->delay = delay; | 207 | data->delay = delay; |
212 | if (data->id == zl2004 || data->id == zl6105) | ||
213 | data->delay = 0; | ||
214 | 208 | ||
215 | /* | 209 | /* |
216 | * Since there was a direct I2C device access above, wait before | 210 | * Since there was a direct I2C device access above, wait before |
diff --git a/drivers/hwmon/w83627ehf.c b/drivers/hwmon/w83627ehf.c index 5276d1933db..a658d62c5e1 100644 --- a/drivers/hwmon/w83627ehf.c +++ b/drivers/hwmon/w83627ehf.c | |||
@@ -39,7 +39,7 @@ | |||
39 | 0x8860 0xa1 | 39 | 0x8860 0xa1 |
40 | w83627dhg 9 5 4 3 0xa020 0xc1 0x5ca3 | 40 | w83627dhg 9 5 4 3 0xa020 0xc1 0x5ca3 |
41 | w83627dhg-p 9 5 4 3 0xb070 0xc1 0x5ca3 | 41 | w83627dhg-p 9 5 4 3 0xb070 0xc1 0x5ca3 |
42 | w83627uhg 8 2 2 2 0xa230 0xc1 0x5ca3 | 42 | w83627uhg 8 2 2 3 0xa230 0xc1 0x5ca3 |
43 | w83667hg 9 5 3 3 0xa510 0xc1 0x5ca3 | 43 | w83667hg 9 5 3 3 0xa510 0xc1 0x5ca3 |
44 | w83667hg-b 9 5 3 4 0xb350 0xc1 0x5ca3 | 44 | w83667hg-b 9 5 3 4 0xb350 0xc1 0x5ca3 |
45 | nct6775f 9 4 3 9 0xb470 0xc1 0x5ca3 | 45 | nct6775f 9 4 3 9 0xb470 0xc1 0x5ca3 |
@@ -1607,7 +1607,7 @@ store_##reg(struct device *dev, struct device_attribute *attr, \ | |||
1607 | val = step_time_to_reg(val, data->pwm_mode[nr]); \ | 1607 | val = step_time_to_reg(val, data->pwm_mode[nr]); \ |
1608 | mutex_lock(&data->update_lock); \ | 1608 | mutex_lock(&data->update_lock); \ |
1609 | data->reg[nr] = val; \ | 1609 | data->reg[nr] = val; \ |
1610 | w83627ehf_write_value(data, W83627EHF_REG_##REG[nr], val); \ | 1610 | w83627ehf_write_value(data, data->REG_##REG[nr], val); \ |
1611 | mutex_unlock(&data->update_lock); \ | 1611 | mutex_unlock(&data->update_lock); \ |
1612 | return count; \ | 1612 | return count; \ |
1613 | } \ | 1613 | } \ |
@@ -2004,7 +2004,8 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev) | |||
2004 | goto exit; | 2004 | goto exit; |
2005 | } | 2005 | } |
2006 | 2006 | ||
2007 | data = kzalloc(sizeof(struct w83627ehf_data), GFP_KERNEL); | 2007 | data = devm_kzalloc(&pdev->dev, sizeof(struct w83627ehf_data), |
2008 | GFP_KERNEL); | ||
2008 | if (!data) { | 2009 | if (!data) { |
2009 | err = -ENOMEM; | 2010 | err = -ENOMEM; |
2010 | goto exit_release; | 2011 | goto exit_release; |
@@ -2157,16 +2158,16 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev) | |||
2157 | w83627ehf_set_temp_reg_ehf(data, 3); | 2158 | w83627ehf_set_temp_reg_ehf(data, 3); |
2158 | 2159 | ||
2159 | /* | 2160 | /* |
2160 | * Temperature sources for temp1 and temp2 are selected with | 2161 | * Temperature sources for temp2 and temp3 are selected with |
2161 | * bank 0, registers 0x49 and 0x4a. | 2162 | * bank 0, registers 0x49 and 0x4a. |
2162 | */ | 2163 | */ |
2163 | data->temp_src[0] = 0; /* SYSTIN */ | 2164 | data->temp_src[0] = 0; /* SYSTIN */ |
2164 | reg = w83627ehf_read_value(data, 0x49) & 0x07; | 2165 | reg = w83627ehf_read_value(data, 0x49) & 0x07; |
2165 | /* Adjust to have the same mapping as other source registers */ | 2166 | /* Adjust to have the same mapping as other source registers */ |
2166 | if (reg == 0) | 2167 | if (reg == 0) |
2167 | data->temp_src[1]++; | 2168 | data->temp_src[1] = 1; |
2168 | else if (reg >= 2 && reg <= 5) | 2169 | else if (reg >= 2 && reg <= 5) |
2169 | data->temp_src[1] += 2; | 2170 | data->temp_src[1] = reg + 2; |
2170 | else /* should never happen */ | 2171 | else /* should never happen */ |
2171 | data->have_temp &= ~(1 << 1); | 2172 | data->have_temp &= ~(1 << 1); |
2172 | reg = w83627ehf_read_value(data, 0x4a); | 2173 | reg = w83627ehf_read_value(data, 0x4a); |
@@ -2493,9 +2494,8 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev) | |||
2493 | 2494 | ||
2494 | exit_remove: | 2495 | exit_remove: |
2495 | w83627ehf_device_remove_files(dev); | 2496 | w83627ehf_device_remove_files(dev); |
2496 | kfree(data); | ||
2497 | platform_set_drvdata(pdev, NULL); | ||
2498 | exit_release: | 2497 | exit_release: |
2498 | platform_set_drvdata(pdev, NULL); | ||
2499 | release_region(res->start, IOREGION_LENGTH); | 2499 | release_region(res->start, IOREGION_LENGTH); |
2500 | exit: | 2500 | exit: |
2501 | return err; | 2501 | return err; |
@@ -2509,7 +2509,6 @@ static int __devexit w83627ehf_remove(struct platform_device *pdev) | |||
2509 | w83627ehf_device_remove_files(&pdev->dev); | 2509 | w83627ehf_device_remove_files(&pdev->dev); |
2510 | release_region(data->addr, IOREGION_LENGTH); | 2510 | release_region(data->addr, IOREGION_LENGTH); |
2511 | platform_set_drvdata(pdev, NULL); | 2511 | platform_set_drvdata(pdev, NULL); |
2512 | kfree(data); | ||
2513 | 2512 | ||
2514 | return 0; | 2513 | return 0; |
2515 | } | 2514 | } |
diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c index 525c7345fa0..24f94f4ae39 100644 --- a/drivers/i2c/algos/i2c-algo-bit.c +++ b/drivers/i2c/algos/i2c-algo-bit.c | |||
@@ -103,8 +103,14 @@ static int sclhi(struct i2c_algo_bit_data *adap) | |||
103 | * chips may hold it low ("clock stretching") while they | 103 | * chips may hold it low ("clock stretching") while they |
104 | * are processing data internally. | 104 | * are processing data internally. |
105 | */ | 105 | */ |
106 | if (time_after(jiffies, start + adap->timeout)) | 106 | if (time_after(jiffies, start + adap->timeout)) { |
107 | /* Test one last time, as we may have been preempted | ||
108 | * between last check and timeout test. | ||
109 | */ | ||
110 | if (getscl(adap)) | ||
111 | break; | ||
107 | return -ETIMEDOUT; | 112 | return -ETIMEDOUT; |
113 | } | ||
108 | cond_resched(); | 114 | cond_resched(); |
109 | } | 115 | } |
110 | #ifdef DEBUG | 116 | #ifdef DEBUG |
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 1e5606185b4..e9c18939eda 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
@@ -1386,8 +1386,10 @@ int i2c_master_send(const struct i2c_client *client, const char *buf, int count) | |||
1386 | 1386 | ||
1387 | ret = i2c_transfer(adap, &msg, 1); | 1387 | ret = i2c_transfer(adap, &msg, 1); |
1388 | 1388 | ||
1389 | /* If everything went ok (i.e. 1 msg transmitted), return #bytes | 1389 | /* |
1390 | transmitted, else error code. */ | 1390 | * If everything went ok (i.e. 1 msg transmitted), return #bytes |
1391 | * transmitted, else error code. | ||
1392 | */ | ||
1391 | return (ret == 1) ? count : ret; | 1393 | return (ret == 1) ? count : ret; |
1392 | } | 1394 | } |
1393 | EXPORT_SYMBOL(i2c_master_send); | 1395 | EXPORT_SYMBOL(i2c_master_send); |
@@ -1414,8 +1416,10 @@ int i2c_master_recv(const struct i2c_client *client, char *buf, int count) | |||
1414 | 1416 | ||
1415 | ret = i2c_transfer(adap, &msg, 1); | 1417 | ret = i2c_transfer(adap, &msg, 1); |
1416 | 1418 | ||
1417 | /* If everything went ok (i.e. 1 msg transmitted), return #bytes | 1419 | /* |
1418 | transmitted, else error code. */ | 1420 | * If everything went ok (i.e. 1 msg received), return #bytes received, |
1421 | * else error code. | ||
1422 | */ | ||
1419 | return (ret == 1) ? count : ret; | 1423 | return (ret == 1) ? count : ret; |
1420 | } | 1424 | } |
1421 | EXPORT_SYMBOL(i2c_master_recv); | 1425 | EXPORT_SYMBOL(i2c_master_recv); |
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index c9c6053198d..a08a53448b7 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c | |||
@@ -48,8 +48,6 @@ | |||
48 | #define ROOT_SIZE VTD_PAGE_SIZE | 48 | #define ROOT_SIZE VTD_PAGE_SIZE |
49 | #define CONTEXT_SIZE VTD_PAGE_SIZE | 49 | #define CONTEXT_SIZE VTD_PAGE_SIZE |
50 | 50 | ||
51 | #define IS_BRIDGE_HOST_DEVICE(pdev) \ | ||
52 | ((pdev->class >> 8) == PCI_CLASS_BRIDGE_HOST) | ||
53 | #define IS_GFX_DEVICE(pdev) ((pdev->class >> 16) == PCI_BASE_CLASS_DISPLAY) | 51 | #define IS_GFX_DEVICE(pdev) ((pdev->class >> 16) == PCI_BASE_CLASS_DISPLAY) |
54 | #define IS_ISA_DEVICE(pdev) ((pdev->class >> 8) == PCI_CLASS_BRIDGE_ISA) | 52 | #define IS_ISA_DEVICE(pdev) ((pdev->class >> 8) == PCI_CLASS_BRIDGE_ISA) |
55 | #define IS_AZALIA(pdev) ((pdev)->vendor == 0x8086 && (pdev)->device == 0x3a3e) | 53 | #define IS_AZALIA(pdev) ((pdev)->vendor == 0x8086 && (pdev)->device == 0x3a3e) |
@@ -356,10 +354,18 @@ static int hw_pass_through = 1; | |||
356 | /* si_domain contains mulitple devices */ | 354 | /* si_domain contains mulitple devices */ |
357 | #define DOMAIN_FLAG_STATIC_IDENTITY (1 << 2) | 355 | #define DOMAIN_FLAG_STATIC_IDENTITY (1 << 2) |
358 | 356 | ||
357 | /* define the limit of IOMMUs supported in each domain */ | ||
358 | #ifdef CONFIG_X86 | ||
359 | # define IOMMU_UNITS_SUPPORTED MAX_IO_APICS | ||
360 | #else | ||
361 | # define IOMMU_UNITS_SUPPORTED 64 | ||
362 | #endif | ||
363 | |||
359 | struct dmar_domain { | 364 | struct dmar_domain { |
360 | int id; /* domain id */ | 365 | int id; /* domain id */ |
361 | int nid; /* node id */ | 366 | int nid; /* node id */ |
362 | unsigned long iommu_bmp; /* bitmap of iommus this domain uses*/ | 367 | DECLARE_BITMAP(iommu_bmp, IOMMU_UNITS_SUPPORTED); |
368 | /* bitmap of iommus this domain uses*/ | ||
363 | 369 | ||
364 | struct list_head devices; /* all devices' list */ | 370 | struct list_head devices; /* all devices' list */ |
365 | struct iova_domain iovad; /* iova's that belong to this domain */ | 371 | struct iova_domain iovad; /* iova's that belong to this domain */ |
@@ -571,7 +577,7 @@ static struct intel_iommu *domain_get_iommu(struct dmar_domain *domain) | |||
571 | BUG_ON(domain->flags & DOMAIN_FLAG_VIRTUAL_MACHINE); | 577 | BUG_ON(domain->flags & DOMAIN_FLAG_VIRTUAL_MACHINE); |
572 | BUG_ON(domain->flags & DOMAIN_FLAG_STATIC_IDENTITY); | 578 | BUG_ON(domain->flags & DOMAIN_FLAG_STATIC_IDENTITY); |
573 | 579 | ||
574 | iommu_id = find_first_bit(&domain->iommu_bmp, g_num_of_iommus); | 580 | iommu_id = find_first_bit(domain->iommu_bmp, g_num_of_iommus); |
575 | if (iommu_id < 0 || iommu_id >= g_num_of_iommus) | 581 | if (iommu_id < 0 || iommu_id >= g_num_of_iommus) |
576 | return NULL; | 582 | return NULL; |
577 | 583 | ||
@@ -584,7 +590,7 @@ static void domain_update_iommu_coherency(struct dmar_domain *domain) | |||
584 | 590 | ||
585 | domain->iommu_coherency = 1; | 591 | domain->iommu_coherency = 1; |
586 | 592 | ||
587 | for_each_set_bit(i, &domain->iommu_bmp, g_num_of_iommus) { | 593 | for_each_set_bit(i, domain->iommu_bmp, g_num_of_iommus) { |
588 | if (!ecap_coherent(g_iommus[i]->ecap)) { | 594 | if (!ecap_coherent(g_iommus[i]->ecap)) { |
589 | domain->iommu_coherency = 0; | 595 | domain->iommu_coherency = 0; |
590 | break; | 596 | break; |
@@ -598,7 +604,7 @@ static void domain_update_iommu_snooping(struct dmar_domain *domain) | |||
598 | 604 | ||
599 | domain->iommu_snooping = 1; | 605 | domain->iommu_snooping = 1; |
600 | 606 | ||
601 | for_each_set_bit(i, &domain->iommu_bmp, g_num_of_iommus) { | 607 | for_each_set_bit(i, domain->iommu_bmp, g_num_of_iommus) { |
602 | if (!ecap_sc_support(g_iommus[i]->ecap)) { | 608 | if (!ecap_sc_support(g_iommus[i]->ecap)) { |
603 | domain->iommu_snooping = 0; | 609 | domain->iommu_snooping = 0; |
604 | break; | 610 | break; |
@@ -1334,7 +1340,7 @@ static struct dmar_domain *alloc_domain(void) | |||
1334 | return NULL; | 1340 | return NULL; |
1335 | 1341 | ||
1336 | domain->nid = -1; | 1342 | domain->nid = -1; |
1337 | memset(&domain->iommu_bmp, 0, sizeof(unsigned long)); | 1343 | memset(domain->iommu_bmp, 0, sizeof(domain->iommu_bmp)); |
1338 | domain->flags = 0; | 1344 | domain->flags = 0; |
1339 | 1345 | ||
1340 | return domain; | 1346 | return domain; |
@@ -1360,7 +1366,7 @@ static int iommu_attach_domain(struct dmar_domain *domain, | |||
1360 | 1366 | ||
1361 | domain->id = num; | 1367 | domain->id = num; |
1362 | set_bit(num, iommu->domain_ids); | 1368 | set_bit(num, iommu->domain_ids); |
1363 | set_bit(iommu->seq_id, &domain->iommu_bmp); | 1369 | set_bit(iommu->seq_id, domain->iommu_bmp); |
1364 | iommu->domains[num] = domain; | 1370 | iommu->domains[num] = domain; |
1365 | spin_unlock_irqrestore(&iommu->lock, flags); | 1371 | spin_unlock_irqrestore(&iommu->lock, flags); |
1366 | 1372 | ||
@@ -1385,7 +1391,7 @@ static void iommu_detach_domain(struct dmar_domain *domain, | |||
1385 | 1391 | ||
1386 | if (found) { | 1392 | if (found) { |
1387 | clear_bit(num, iommu->domain_ids); | 1393 | clear_bit(num, iommu->domain_ids); |
1388 | clear_bit(iommu->seq_id, &domain->iommu_bmp); | 1394 | clear_bit(iommu->seq_id, domain->iommu_bmp); |
1389 | iommu->domains[num] = NULL; | 1395 | iommu->domains[num] = NULL; |
1390 | } | 1396 | } |
1391 | spin_unlock_irqrestore(&iommu->lock, flags); | 1397 | spin_unlock_irqrestore(&iommu->lock, flags); |
@@ -1527,7 +1533,7 @@ static void domain_exit(struct dmar_domain *domain) | |||
1527 | dma_pte_free_pagetable(domain, 0, DOMAIN_MAX_PFN(domain->gaw)); | 1533 | dma_pte_free_pagetable(domain, 0, DOMAIN_MAX_PFN(domain->gaw)); |
1528 | 1534 | ||
1529 | for_each_active_iommu(iommu, drhd) | 1535 | for_each_active_iommu(iommu, drhd) |
1530 | if (test_bit(iommu->seq_id, &domain->iommu_bmp)) | 1536 | if (test_bit(iommu->seq_id, domain->iommu_bmp)) |
1531 | iommu_detach_domain(domain, iommu); | 1537 | iommu_detach_domain(domain, iommu); |
1532 | 1538 | ||
1533 | free_domain_mem(domain); | 1539 | free_domain_mem(domain); |
@@ -1653,7 +1659,7 @@ static int domain_context_mapping_one(struct dmar_domain *domain, int segment, | |||
1653 | spin_unlock_irqrestore(&iommu->lock, flags); | 1659 | spin_unlock_irqrestore(&iommu->lock, flags); |
1654 | 1660 | ||
1655 | spin_lock_irqsave(&domain->iommu_lock, flags); | 1661 | spin_lock_irqsave(&domain->iommu_lock, flags); |
1656 | if (!test_and_set_bit(iommu->seq_id, &domain->iommu_bmp)) { | 1662 | if (!test_and_set_bit(iommu->seq_id, domain->iommu_bmp)) { |
1657 | domain->iommu_count++; | 1663 | domain->iommu_count++; |
1658 | if (domain->iommu_count == 1) | 1664 | if (domain->iommu_count == 1) |
1659 | domain->nid = iommu->node; | 1665 | domain->nid = iommu->node; |
@@ -2369,18 +2375,18 @@ static int __init iommu_prepare_static_identity_mapping(int hw) | |||
2369 | return -EFAULT; | 2375 | return -EFAULT; |
2370 | 2376 | ||
2371 | for_each_pci_dev(pdev) { | 2377 | for_each_pci_dev(pdev) { |
2372 | /* Skip Host/PCI Bridge devices */ | ||
2373 | if (IS_BRIDGE_HOST_DEVICE(pdev)) | ||
2374 | continue; | ||
2375 | if (iommu_should_identity_map(pdev, 1)) { | 2378 | if (iommu_should_identity_map(pdev, 1)) { |
2376 | printk(KERN_INFO "IOMMU: %s identity mapping for device %s\n", | ||
2377 | hw ? "hardware" : "software", pci_name(pdev)); | ||
2378 | |||
2379 | ret = domain_add_dev_info(si_domain, pdev, | 2379 | ret = domain_add_dev_info(si_domain, pdev, |
2380 | hw ? CONTEXT_TT_PASS_THROUGH : | 2380 | hw ? CONTEXT_TT_PASS_THROUGH : |
2381 | CONTEXT_TT_MULTI_LEVEL); | 2381 | CONTEXT_TT_MULTI_LEVEL); |
2382 | if (ret) | 2382 | if (ret) { |
2383 | /* device not associated with an iommu */ | ||
2384 | if (ret == -ENODEV) | ||
2385 | continue; | ||
2383 | return ret; | 2386 | return ret; |
2387 | } | ||
2388 | pr_info("IOMMU: %s identity mapping for device %s\n", | ||
2389 | hw ? "hardware" : "software", pci_name(pdev)); | ||
2384 | } | 2390 | } |
2385 | } | 2391 | } |
2386 | 2392 | ||
@@ -2402,12 +2408,17 @@ static int __init init_dmars(void) | |||
2402 | * endfor | 2408 | * endfor |
2403 | */ | 2409 | */ |
2404 | for_each_drhd_unit(drhd) { | 2410 | for_each_drhd_unit(drhd) { |
2405 | g_num_of_iommus++; | ||
2406 | /* | 2411 | /* |
2407 | * lock not needed as this is only incremented in the single | 2412 | * lock not needed as this is only incremented in the single |
2408 | * threaded kernel __init code path all other access are read | 2413 | * threaded kernel __init code path all other access are read |
2409 | * only | 2414 | * only |
2410 | */ | 2415 | */ |
2416 | if (g_num_of_iommus < IOMMU_UNITS_SUPPORTED) { | ||
2417 | g_num_of_iommus++; | ||
2418 | continue; | ||
2419 | } | ||
2420 | printk_once(KERN_ERR "intel-iommu: exceeded %d IOMMUs\n", | ||
2421 | IOMMU_UNITS_SUPPORTED); | ||
2411 | } | 2422 | } |
2412 | 2423 | ||
2413 | g_iommus = kcalloc(g_num_of_iommus, sizeof(struct intel_iommu *), | 2424 | g_iommus = kcalloc(g_num_of_iommus, sizeof(struct intel_iommu *), |
@@ -3748,7 +3759,7 @@ static void domain_remove_one_dev_info(struct dmar_domain *domain, | |||
3748 | if (found == 0) { | 3759 | if (found == 0) { |
3749 | unsigned long tmp_flags; | 3760 | unsigned long tmp_flags; |
3750 | spin_lock_irqsave(&domain->iommu_lock, tmp_flags); | 3761 | spin_lock_irqsave(&domain->iommu_lock, tmp_flags); |
3751 | clear_bit(iommu->seq_id, &domain->iommu_bmp); | 3762 | clear_bit(iommu->seq_id, domain->iommu_bmp); |
3752 | domain->iommu_count--; | 3763 | domain->iommu_count--; |
3753 | domain_update_iommu_cap(domain); | 3764 | domain_update_iommu_cap(domain); |
3754 | spin_unlock_irqrestore(&domain->iommu_lock, tmp_flags); | 3765 | spin_unlock_irqrestore(&domain->iommu_lock, tmp_flags); |
@@ -3790,7 +3801,7 @@ static void vm_domain_remove_all_dev_info(struct dmar_domain *domain) | |||
3790 | */ | 3801 | */ |
3791 | spin_lock_irqsave(&domain->iommu_lock, flags2); | 3802 | spin_lock_irqsave(&domain->iommu_lock, flags2); |
3792 | if (test_and_clear_bit(iommu->seq_id, | 3803 | if (test_and_clear_bit(iommu->seq_id, |
3793 | &domain->iommu_bmp)) { | 3804 | domain->iommu_bmp)) { |
3794 | domain->iommu_count--; | 3805 | domain->iommu_count--; |
3795 | domain_update_iommu_cap(domain); | 3806 | domain_update_iommu_cap(domain); |
3796 | } | 3807 | } |
@@ -3815,7 +3826,7 @@ static struct dmar_domain *iommu_alloc_vm_domain(void) | |||
3815 | 3826 | ||
3816 | domain->id = vm_domid++; | 3827 | domain->id = vm_domid++; |
3817 | domain->nid = -1; | 3828 | domain->nid = -1; |
3818 | memset(&domain->iommu_bmp, 0, sizeof(unsigned long)); | 3829 | memset(domain->iommu_bmp, 0, sizeof(domain->iommu_bmp)); |
3819 | domain->flags = DOMAIN_FLAG_VIRTUAL_MACHINE; | 3830 | domain->flags = DOMAIN_FLAG_VIRTUAL_MACHINE; |
3820 | 3831 | ||
3821 | return domain; | 3832 | return domain; |
diff --git a/drivers/media/dvb/siano/smsdvb.c b/drivers/media/dvb/siano/smsdvb.c index 654685c9303..aa77e54a8fa 100644 --- a/drivers/media/dvb/siano/smsdvb.c +++ b/drivers/media/dvb/siano/smsdvb.c | |||
@@ -49,9 +49,6 @@ struct smsdvb_client_t { | |||
49 | 49 | ||
50 | struct completion tune_done; | 50 | struct completion tune_done; |
51 | 51 | ||
52 | /* todo: save freq/band instead whole struct */ | ||
53 | struct dtv_frontend_properties fe_params; | ||
54 | |||
55 | struct SMSHOSTLIB_STATISTICS_DVB_S sms_stat_dvb; | 52 | struct SMSHOSTLIB_STATISTICS_DVB_S sms_stat_dvb; |
56 | int event_fe_state; | 53 | int event_fe_state; |
57 | int event_unc_state; | 54 | int event_unc_state; |
@@ -744,12 +741,124 @@ static int smsdvb_get_frontend(struct dvb_frontend *fe) | |||
744 | struct dtv_frontend_properties *fep = &fe->dtv_property_cache; | 741 | struct dtv_frontend_properties *fep = &fe->dtv_property_cache; |
745 | struct smsdvb_client_t *client = | 742 | struct smsdvb_client_t *client = |
746 | container_of(fe, struct smsdvb_client_t, frontend); | 743 | container_of(fe, struct smsdvb_client_t, frontend); |
744 | struct smscore_device_t *coredev = client->coredev; | ||
745 | struct TRANSMISSION_STATISTICS_S *td = | ||
746 | &client->sms_stat_dvb.TransmissionData; | ||
747 | 747 | ||
748 | sms_debug(""); | 748 | switch (smscore_get_device_mode(coredev)) { |
749 | case DEVICE_MODE_DVBT: | ||
750 | case DEVICE_MODE_DVBT_BDA: | ||
751 | fep->frequency = td->Frequency; | ||
752 | |||
753 | switch (td->Bandwidth) { | ||
754 | case 6: | ||
755 | fep->bandwidth_hz = 6000000; | ||
756 | break; | ||
757 | case 7: | ||
758 | fep->bandwidth_hz = 7000000; | ||
759 | break; | ||
760 | case 8: | ||
761 | fep->bandwidth_hz = 8000000; | ||
762 | break; | ||
763 | } | ||
764 | |||
765 | switch (td->TransmissionMode) { | ||
766 | case 2: | ||
767 | fep->transmission_mode = TRANSMISSION_MODE_2K; | ||
768 | break; | ||
769 | case 8: | ||
770 | fep->transmission_mode = TRANSMISSION_MODE_8K; | ||
771 | } | ||
772 | |||
773 | switch (td->GuardInterval) { | ||
774 | case 0: | ||
775 | fep->guard_interval = GUARD_INTERVAL_1_32; | ||
776 | break; | ||
777 | case 1: | ||
778 | fep->guard_interval = GUARD_INTERVAL_1_16; | ||
779 | break; | ||
780 | case 2: | ||
781 | fep->guard_interval = GUARD_INTERVAL_1_8; | ||
782 | break; | ||
783 | case 3: | ||
784 | fep->guard_interval = GUARD_INTERVAL_1_4; | ||
785 | break; | ||
786 | } | ||
787 | |||
788 | switch (td->CodeRate) { | ||
789 | case 0: | ||
790 | fep->code_rate_HP = FEC_1_2; | ||
791 | break; | ||
792 | case 1: | ||
793 | fep->code_rate_HP = FEC_2_3; | ||
794 | break; | ||
795 | case 2: | ||
796 | fep->code_rate_HP = FEC_3_4; | ||
797 | break; | ||
798 | case 3: | ||
799 | fep->code_rate_HP = FEC_5_6; | ||
800 | break; | ||
801 | case 4: | ||
802 | fep->code_rate_HP = FEC_7_8; | ||
803 | break; | ||
804 | } | ||
805 | |||
806 | switch (td->LPCodeRate) { | ||
807 | case 0: | ||
808 | fep->code_rate_LP = FEC_1_2; | ||
809 | break; | ||
810 | case 1: | ||
811 | fep->code_rate_LP = FEC_2_3; | ||
812 | break; | ||
813 | case 2: | ||
814 | fep->code_rate_LP = FEC_3_4; | ||
815 | break; | ||
816 | case 3: | ||
817 | fep->code_rate_LP = FEC_5_6; | ||
818 | break; | ||
819 | case 4: | ||
820 | fep->code_rate_LP = FEC_7_8; | ||
821 | break; | ||
822 | } | ||
823 | |||
824 | switch (td->Constellation) { | ||
825 | case 0: | ||
826 | fep->modulation = QPSK; | ||
827 | break; | ||
828 | case 1: | ||
829 | fep->modulation = QAM_16; | ||
830 | break; | ||
831 | case 2: | ||
832 | fep->modulation = QAM_64; | ||
833 | break; | ||
834 | } | ||
835 | |||
836 | switch (td->Hierarchy) { | ||
837 | case 0: | ||
838 | fep->hierarchy = HIERARCHY_NONE; | ||
839 | break; | ||
840 | case 1: | ||
841 | fep->hierarchy = HIERARCHY_1; | ||
842 | break; | ||
843 | case 2: | ||
844 | fep->hierarchy = HIERARCHY_2; | ||
845 | break; | ||
846 | case 3: | ||
847 | fep->hierarchy = HIERARCHY_4; | ||
848 | break; | ||
849 | } | ||
749 | 850 | ||
750 | /* todo: */ | 851 | fep->inversion = INVERSION_AUTO; |
751 | memcpy(fep, &client->fe_params, | 852 | break; |
752 | sizeof(struct dtv_frontend_properties)); | 853 | case DEVICE_MODE_ISDBT: |
854 | case DEVICE_MODE_ISDBT_BDA: | ||
855 | fep->frequency = td->Frequency; | ||
856 | fep->bandwidth_hz = 6000000; | ||
857 | /* todo: retrive the other parameters */ | ||
858 | break; | ||
859 | default: | ||
860 | return -EINVAL; | ||
861 | } | ||
753 | 862 | ||
754 | return 0; | 863 | return 0; |
755 | } | 864 | } |
@@ -872,11 +981,11 @@ static int smsdvb_hotplug(struct smscore_device_t *coredev, | |||
872 | switch (smscore_get_device_mode(coredev)) { | 981 | switch (smscore_get_device_mode(coredev)) { |
873 | case DEVICE_MODE_DVBT: | 982 | case DEVICE_MODE_DVBT: |
874 | case DEVICE_MODE_DVBT_BDA: | 983 | case DEVICE_MODE_DVBT_BDA: |
875 | smsdvb_fe_ops.delsys[0] = SYS_DVBT; | 984 | client->frontend.ops.delsys[0] = SYS_DVBT; |
876 | break; | 985 | break; |
877 | case DEVICE_MODE_ISDBT: | 986 | case DEVICE_MODE_ISDBT: |
878 | case DEVICE_MODE_ISDBT_BDA: | 987 | case DEVICE_MODE_ISDBT_BDA: |
879 | smsdvb_fe_ops.delsys[0] = SYS_ISDBT; | 988 | client->frontend.ops.delsys[0] = SYS_ISDBT; |
880 | break; | 989 | break; |
881 | } | 990 | } |
882 | 991 | ||
diff --git a/drivers/media/video/davinci/isif.c b/drivers/media/video/davinci/isif.c index 1e63852374b..5278fe7d6d0 100644 --- a/drivers/media/video/davinci/isif.c +++ b/drivers/media/video/davinci/isif.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <linux/videodev2.h> | 34 | #include <linux/videodev2.h> |
35 | #include <linux/clk.h> | 35 | #include <linux/clk.h> |
36 | #include <linux/err.h> | 36 | #include <linux/err.h> |
37 | #include <linux/module.h> | ||
37 | 38 | ||
38 | #include <mach/mux.h> | 39 | #include <mach/mux.h> |
39 | 40 | ||
diff --git a/drivers/media/video/uvc/uvc_video.c b/drivers/media/video/uvc/uvc_video.c index c7e69b8f81c..4a44f9a1bae 100644 --- a/drivers/media/video/uvc/uvc_video.c +++ b/drivers/media/video/uvc/uvc_video.c | |||
@@ -611,9 +611,11 @@ void uvc_video_clock_update(struct uvc_streaming *stream, | |||
611 | delta_stc = buf->pts - (1UL << 31); | 611 | delta_stc = buf->pts - (1UL << 31); |
612 | x1 = first->dev_stc - delta_stc; | 612 | x1 = first->dev_stc - delta_stc; |
613 | x2 = last->dev_stc - delta_stc; | 613 | x2 = last->dev_stc - delta_stc; |
614 | if (x1 == x2) | ||
615 | goto done; | ||
616 | |||
614 | y1 = (first->dev_sof + 2048) << 16; | 617 | y1 = (first->dev_sof + 2048) << 16; |
615 | y2 = (last->dev_sof + 2048) << 16; | 618 | y2 = (last->dev_sof + 2048) << 16; |
616 | |||
617 | if (y2 < y1) | 619 | if (y2 < y1) |
618 | y2 += 2048 << 16; | 620 | y2 += 2048 << 16; |
619 | 621 | ||
@@ -631,14 +633,16 @@ void uvc_video_clock_update(struct uvc_streaming *stream, | |||
631 | x1, x2, y1, y2, clock->sof_offset); | 633 | x1, x2, y1, y2, clock->sof_offset); |
632 | 634 | ||
633 | /* Second step, SOF to host clock conversion. */ | 635 | /* Second step, SOF to host clock conversion. */ |
634 | ts = timespec_sub(last->host_ts, first->host_ts); | ||
635 | x1 = (uvc_video_clock_host_sof(first) + 2048) << 16; | 636 | x1 = (uvc_video_clock_host_sof(first) + 2048) << 16; |
636 | x2 = (uvc_video_clock_host_sof(last) + 2048) << 16; | 637 | x2 = (uvc_video_clock_host_sof(last) + 2048) << 16; |
637 | y1 = NSEC_PER_SEC; | ||
638 | y2 = (ts.tv_sec + 1) * NSEC_PER_SEC + ts.tv_nsec; | ||
639 | |||
640 | if (x2 < x1) | 638 | if (x2 < x1) |
641 | x2 += 2048 << 16; | 639 | x2 += 2048 << 16; |
640 | if (x1 == x2) | ||
641 | goto done; | ||
642 | |||
643 | ts = timespec_sub(last->host_ts, first->host_ts); | ||
644 | y1 = NSEC_PER_SEC; | ||
645 | y2 = (ts.tv_sec + 1) * NSEC_PER_SEC + ts.tv_nsec; | ||
642 | 646 | ||
643 | /* Interpolated and host SOF timestamps can wrap around at slightly | 647 | /* Interpolated and host SOF timestamps can wrap around at slightly |
644 | * different times. Handle this by adding or removing 2048 to or from | 648 | * different times. Handle this by adding or removing 2048 to or from |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index 7aee46983be..99389c8dda2 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
@@ -1934,7 +1934,7 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) | |||
1934 | } | 1934 | } |
1935 | 1935 | ||
1936 | if (bp->port.pmf) | 1936 | if (bp->port.pmf) |
1937 | bnx2x_update_drv_flags(bp, DRV_FLAGS_DCB_CONFIGURED, 0); | 1937 | bnx2x_update_drv_flags(bp, 1 << DRV_FLAGS_DCB_CONFIGURED, 0); |
1938 | else | 1938 | else |
1939 | bnx2x__link_status_update(bp); | 1939 | bnx2x__link_status_update(bp); |
1940 | 1940 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h index bf27c54ff2e..4f40f7d7d8c 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h | |||
@@ -1179,10 +1179,16 @@ static inline int bnx2x_alloc_rx_bds(struct bnx2x_fastpath *fp, | |||
1179 | */ | 1179 | */ |
1180 | static inline u8 bnx2x_stats_id(struct bnx2x_fastpath *fp) | 1180 | static inline u8 bnx2x_stats_id(struct bnx2x_fastpath *fp) |
1181 | { | 1181 | { |
1182 | if (!CHIP_IS_E1x(fp->bp)) | 1182 | struct bnx2x *bp = fp->bp; |
1183 | if (!CHIP_IS_E1x(bp)) { | ||
1184 | #ifdef BCM_CNIC | ||
1185 | /* there are special statistics counters for FCoE 136..140 */ | ||
1186 | if (IS_FCOE_FP(fp)) | ||
1187 | return bp->cnic_base_cl_id + (bp->pf_num >> 1); | ||
1188 | #endif | ||
1183 | return fp->cl_id; | 1189 | return fp->cl_id; |
1184 | else | 1190 | } |
1185 | return fp->cl_id + BP_PORT(fp->bp) * FP_SB_MAX_E1x; | 1191 | return fp->cl_id + BP_PORT(bp) * FP_SB_MAX_E1x; |
1186 | } | 1192 | } |
1187 | 1193 | ||
1188 | static inline void bnx2x_init_vlan_mac_fp_objs(struct bnx2x_fastpath *fp, | 1194 | static inline void bnx2x_init_vlan_mac_fp_objs(struct bnx2x_fastpath *fp, |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c index 5051cf3deb2..6d82ade4c31 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c | |||
@@ -735,7 +735,9 @@ void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state) | |||
735 | bp->dcbx_error); | 735 | bp->dcbx_error); |
736 | 736 | ||
737 | /* mark DCBX result for PMF migration */ | 737 | /* mark DCBX result for PMF migration */ |
738 | bnx2x_update_drv_flags(bp, DRV_FLAGS_DCB_CONFIGURED, 1); | 738 | bnx2x_update_drv_flags(bp, |
739 | 1 << DRV_FLAGS_DCB_CONFIGURED, | ||
740 | 1); | ||
739 | #ifdef BCM_DCBNL | 741 | #ifdef BCM_DCBNL |
740 | /* | 742 | /* |
741 | * Add new app tlvs to dcbnl | 743 | * Add new app tlvs to dcbnl |
@@ -1020,7 +1022,7 @@ void bnx2x_dcbx_init(struct bnx2x *bp) | |||
1020 | DP(NETIF_MSG_LINK, "dcbx_lldp_params_offset 0x%x\n", | 1022 | DP(NETIF_MSG_LINK, "dcbx_lldp_params_offset 0x%x\n", |
1021 | dcbx_lldp_params_offset); | 1023 | dcbx_lldp_params_offset); |
1022 | 1024 | ||
1023 | bnx2x_update_drv_flags(bp, DRV_FLAGS_DCB_CONFIGURED, 0); | 1025 | bnx2x_update_drv_flags(bp, 1 << DRV_FLAGS_DCB_CONFIGURED, 0); |
1024 | 1026 | ||
1025 | if (SHMEM_LLDP_DCBX_PARAMS_NONE != dcbx_lldp_params_offset) { | 1027 | if (SHMEM_LLDP_DCBX_PARAMS_NONE != dcbx_lldp_params_offset) { |
1026 | bnx2x_dcbx_admin_mib_updated_params(bp, | 1028 | bnx2x_dcbx_admin_mib_updated_params(bp, |
@@ -1857,7 +1859,7 @@ void bnx2x_dcbx_pmf_update(struct bnx2x *bp) | |||
1857 | * read it from shmem and update bp and netdev accordingly | 1859 | * read it from shmem and update bp and netdev accordingly |
1858 | */ | 1860 | */ |
1859 | if (SHMEM2_HAS(bp, drv_flags) && | 1861 | if (SHMEM2_HAS(bp, drv_flags) && |
1860 | GET_FLAGS(SHMEM2_RD(bp, drv_flags), DRV_FLAGS_DCB_CONFIGURED)) { | 1862 | GET_FLAGS(SHMEM2_RD(bp, drv_flags), 1 << DRV_FLAGS_DCB_CONFIGURED)) { |
1861 | /* Read neg results if dcbx is in the FW */ | 1863 | /* Read neg results if dcbx is in the FW */ |
1862 | if (bnx2x_dcbx_read_shmem_neg_results(bp)) | 1864 | if (bnx2x_dcbx_read_shmem_neg_results(bp)) |
1863 | return; | 1865 | return; |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index 25452131915..b69f8762b33 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
@@ -10824,38 +10824,36 @@ do { \ | |||
10824 | 10824 | ||
10825 | int bnx2x_init_firmware(struct bnx2x *bp) | 10825 | int bnx2x_init_firmware(struct bnx2x *bp) |
10826 | { | 10826 | { |
10827 | const char *fw_file_name; | ||
10827 | struct bnx2x_fw_file_hdr *fw_hdr; | 10828 | struct bnx2x_fw_file_hdr *fw_hdr; |
10828 | int rc; | 10829 | int rc; |
10829 | 10830 | ||
10831 | if (bp->firmware) | ||
10832 | return 0; | ||
10830 | 10833 | ||
10831 | if (!bp->firmware) { | 10834 | if (CHIP_IS_E1(bp)) |
10832 | const char *fw_file_name; | 10835 | fw_file_name = FW_FILE_NAME_E1; |
10833 | 10836 | else if (CHIP_IS_E1H(bp)) | |
10834 | if (CHIP_IS_E1(bp)) | 10837 | fw_file_name = FW_FILE_NAME_E1H; |
10835 | fw_file_name = FW_FILE_NAME_E1; | 10838 | else if (!CHIP_IS_E1x(bp)) |
10836 | else if (CHIP_IS_E1H(bp)) | 10839 | fw_file_name = FW_FILE_NAME_E2; |
10837 | fw_file_name = FW_FILE_NAME_E1H; | 10840 | else { |
10838 | else if (!CHIP_IS_E1x(bp)) | 10841 | BNX2X_ERR("Unsupported chip revision\n"); |
10839 | fw_file_name = FW_FILE_NAME_E2; | 10842 | return -EINVAL; |
10840 | else { | 10843 | } |
10841 | BNX2X_ERR("Unsupported chip revision\n"); | 10844 | BNX2X_DEV_INFO("Loading %s\n", fw_file_name); |
10842 | return -EINVAL; | ||
10843 | } | ||
10844 | BNX2X_DEV_INFO("Loading %s\n", fw_file_name); | ||
10845 | 10845 | ||
10846 | rc = request_firmware(&bp->firmware, fw_file_name, | 10846 | rc = request_firmware(&bp->firmware, fw_file_name, &bp->pdev->dev); |
10847 | &bp->pdev->dev); | 10847 | if (rc) { |
10848 | if (rc) { | 10848 | BNX2X_ERR("Can't load firmware file %s\n", |
10849 | BNX2X_ERR("Can't load firmware file %s\n", | 10849 | fw_file_name); |
10850 | fw_file_name); | 10850 | goto request_firmware_exit; |
10851 | goto request_firmware_exit; | 10851 | } |
10852 | } | ||
10853 | 10852 | ||
10854 | rc = bnx2x_check_firmware(bp); | 10853 | rc = bnx2x_check_firmware(bp); |
10855 | if (rc) { | 10854 | if (rc) { |
10856 | BNX2X_ERR("Corrupt firmware file %s\n", fw_file_name); | 10855 | BNX2X_ERR("Corrupt firmware file %s\n", fw_file_name); |
10857 | goto request_firmware_exit; | 10856 | goto request_firmware_exit; |
10858 | } | ||
10859 | } | 10857 | } |
10860 | 10858 | ||
10861 | fw_hdr = (struct bnx2x_fw_file_hdr *)bp->firmware->data; | 10859 | fw_hdr = (struct bnx2x_fw_file_hdr *)bp->firmware->data; |
@@ -10901,6 +10899,7 @@ init_ops_alloc_err: | |||
10901 | kfree(bp->init_data); | 10899 | kfree(bp->init_data); |
10902 | request_firmware_exit: | 10900 | request_firmware_exit: |
10903 | release_firmware(bp->firmware); | 10901 | release_firmware(bp->firmware); |
10902 | bp->firmware = NULL; | ||
10904 | 10903 | ||
10905 | return rc; | 10904 | return rc; |
10906 | } | 10905 | } |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c index cb6339c3557..94110e9ce51 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c | |||
@@ -5601,7 +5601,7 @@ static inline int bnx2x_func_send_start(struct bnx2x *bp, | |||
5601 | 5601 | ||
5602 | /* Fill the ramrod data with provided parameters */ | 5602 | /* Fill the ramrod data with provided parameters */ |
5603 | rdata->function_mode = cpu_to_le16(start_params->mf_mode); | 5603 | rdata->function_mode = cpu_to_le16(start_params->mf_mode); |
5604 | rdata->sd_vlan_tag = start_params->sd_vlan_tag; | 5604 | rdata->sd_vlan_tag = cpu_to_le16(start_params->sd_vlan_tag); |
5605 | rdata->path_id = BP_PATH(bp); | 5605 | rdata->path_id = BP_PATH(bp); |
5606 | rdata->network_cos_mode = start_params->network_cos_mode; | 5606 | rdata->network_cos_mode = start_params->network_cos_mode; |
5607 | 5607 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c index 1adef266fcd..a766b25eec5 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c | |||
@@ -554,23 +554,11 @@ static void bnx2x_bmac_stats_update(struct bnx2x *bp) | |||
554 | UPDATE_STAT64(tx_stat_gtufl, tx_stat_mac_ufl); | 554 | UPDATE_STAT64(tx_stat_gtufl, tx_stat_mac_ufl); |
555 | 555 | ||
556 | /* collect PFC stats */ | 556 | /* collect PFC stats */ |
557 | DIFF_64(diff.hi, new->tx_stat_gtpp_hi, | ||
558 | pstats->pfc_frames_tx_hi, | ||
559 | diff.lo, new->tx_stat_gtpp_lo, | ||
560 | pstats->pfc_frames_tx_lo); | ||
561 | pstats->pfc_frames_tx_hi = new->tx_stat_gtpp_hi; | 557 | pstats->pfc_frames_tx_hi = new->tx_stat_gtpp_hi; |
562 | pstats->pfc_frames_tx_lo = new->tx_stat_gtpp_lo; | 558 | pstats->pfc_frames_tx_lo = new->tx_stat_gtpp_lo; |
563 | ADD_64(pstats->pfc_frames_tx_hi, diff.hi, | ||
564 | pstats->pfc_frames_tx_lo, diff.lo); | ||
565 | 559 | ||
566 | DIFF_64(diff.hi, new->rx_stat_grpp_hi, | ||
567 | pstats->pfc_frames_rx_hi, | ||
568 | diff.lo, new->rx_stat_grpp_lo, | ||
569 | pstats->pfc_frames_rx_lo); | ||
570 | pstats->pfc_frames_rx_hi = new->rx_stat_grpp_hi; | 560 | pstats->pfc_frames_rx_hi = new->rx_stat_grpp_hi; |
571 | pstats->pfc_frames_rx_lo = new->rx_stat_grpp_lo; | 561 | pstats->pfc_frames_rx_lo = new->rx_stat_grpp_lo; |
572 | ADD_64(pstats->pfc_frames_rx_hi, diff.hi, | ||
573 | pstats->pfc_frames_rx_lo, diff.lo); | ||
574 | } | 562 | } |
575 | 563 | ||
576 | estats->pause_frames_received_hi = | 564 | estats->pause_frames_received_hi = |
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index bf01841bda5..610860f2896 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c | |||
@@ -166,7 +166,7 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net) | |||
166 | 166 | ||
167 | dev_kfree_skb(skb); | 167 | dev_kfree_skb(skb); |
168 | net->stats.tx_dropped++; | 168 | net->stats.tx_dropped++; |
169 | return NETDEV_TX_BUSY; | 169 | return NETDEV_TX_OK; |
170 | } | 170 | } |
171 | 171 | ||
172 | packet->extension = (void *)(unsigned long)packet + | 172 | packet->extension = (void *)(unsigned long)packet + |
@@ -226,7 +226,7 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net) | |||
226 | dev_kfree_skb_any(skb); | 226 | dev_kfree_skb_any(skb); |
227 | } | 227 | } |
228 | 228 | ||
229 | return ret ? NETDEV_TX_BUSY : NETDEV_TX_OK; | 229 | return NETDEV_TX_OK; |
230 | } | 230 | } |
231 | 231 | ||
232 | /* | 232 | /* |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 93c5d72711b..2d7601dd666 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
@@ -359,7 +359,7 @@ static void tun_free_netdev(struct net_device *dev) | |||
359 | { | 359 | { |
360 | struct tun_struct *tun = netdev_priv(dev); | 360 | struct tun_struct *tun = netdev_priv(dev); |
361 | 361 | ||
362 | sock_put(tun->socket.sk); | 362 | sk_release_kernel(tun->socket.sk); |
363 | } | 363 | } |
364 | 364 | ||
365 | /* Net device open. */ | 365 | /* Net device open. */ |
@@ -980,10 +980,18 @@ static int tun_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
980 | return ret; | 980 | return ret; |
981 | } | 981 | } |
982 | 982 | ||
983 | static int tun_release(struct socket *sock) | ||
984 | { | ||
985 | if (sock->sk) | ||
986 | sock_put(sock->sk); | ||
987 | return 0; | ||
988 | } | ||
989 | |||
983 | /* Ops structure to mimic raw sockets with tun */ | 990 | /* Ops structure to mimic raw sockets with tun */ |
984 | static const struct proto_ops tun_socket_ops = { | 991 | static const struct proto_ops tun_socket_ops = { |
985 | .sendmsg = tun_sendmsg, | 992 | .sendmsg = tun_sendmsg, |
986 | .recvmsg = tun_recvmsg, | 993 | .recvmsg = tun_recvmsg, |
994 | .release = tun_release, | ||
987 | }; | 995 | }; |
988 | 996 | ||
989 | static struct proto tun_proto = { | 997 | static struct proto tun_proto = { |
@@ -1110,10 +1118,11 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr) | |||
1110 | tun->vnet_hdr_sz = sizeof(struct virtio_net_hdr); | 1118 | tun->vnet_hdr_sz = sizeof(struct virtio_net_hdr); |
1111 | 1119 | ||
1112 | err = -ENOMEM; | 1120 | err = -ENOMEM; |
1113 | sk = sk_alloc(net, AF_UNSPEC, GFP_KERNEL, &tun_proto); | 1121 | sk = sk_alloc(&init_net, AF_UNSPEC, GFP_KERNEL, &tun_proto); |
1114 | if (!sk) | 1122 | if (!sk) |
1115 | goto err_free_dev; | 1123 | goto err_free_dev; |
1116 | 1124 | ||
1125 | sk_change_net(sk, net); | ||
1117 | tun->socket.wq = &tun->wq; | 1126 | tun->socket.wq = &tun->wq; |
1118 | init_waitqueue_head(&tun->wq.wait); | 1127 | init_waitqueue_head(&tun->wq.wait); |
1119 | tun->socket.ops = &tun_socket_ops; | 1128 | tun->socket.ops = &tun_socket_ops; |
@@ -1174,7 +1183,7 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr) | |||
1174 | return 0; | 1183 | return 0; |
1175 | 1184 | ||
1176 | err_free_sk: | 1185 | err_free_sk: |
1177 | sock_put(sk); | 1186 | tun_free_netdev(dev); |
1178 | err_free_dev: | 1187 | err_free_dev: |
1179 | free_netdev(dev); | 1188 | free_netdev(dev); |
1180 | failed: | 1189 | failed: |
diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c index 8e84f5bdd6c..d6da5eed545 100644 --- a/drivers/net/usb/asix.c +++ b/drivers/net/usb/asix.c | |||
@@ -1599,6 +1599,10 @@ static const struct usb_device_id products [] = { | |||
1599 | USB_DEVICE (0x6189, 0x182d), | 1599 | USB_DEVICE (0x6189, 0x182d), |
1600 | .driver_info = (unsigned long) &ax8817x_info, | 1600 | .driver_info = (unsigned long) &ax8817x_info, |
1601 | }, { | 1601 | }, { |
1602 | // Sitecom LN-031 "USB 2.0 10/100/1000 Ethernet adapter" | ||
1603 | USB_DEVICE (0x0df6, 0x0056), | ||
1604 | .driver_info = (unsigned long) &ax88178_info, | ||
1605 | }, { | ||
1602 | // corega FEther USB2-TX | 1606 | // corega FEther USB2-TX |
1603 | USB_DEVICE (0x07aa, 0x0017), | 1607 | USB_DEVICE (0x07aa, 0x0017), |
1604 | .driver_info = (unsigned long) &ax8817x_info, | 1608 | .driver_info = (unsigned long) &ax8817x_info, |
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 81b96e30375..59681f01a54 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c | |||
@@ -328,13 +328,13 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags) | |||
328 | unsigned long lockflags; | 328 | unsigned long lockflags; |
329 | size_t size = dev->rx_urb_size; | 329 | size_t size = dev->rx_urb_size; |
330 | 330 | ||
331 | if ((skb = alloc_skb (size + NET_IP_ALIGN, flags)) == NULL) { | 331 | skb = __netdev_alloc_skb_ip_align(dev->net, size, flags); |
332 | if (!skb) { | ||
332 | netif_dbg(dev, rx_err, dev->net, "no rx skb\n"); | 333 | netif_dbg(dev, rx_err, dev->net, "no rx skb\n"); |
333 | usbnet_defer_kevent (dev, EVENT_RX_MEMORY); | 334 | usbnet_defer_kevent (dev, EVENT_RX_MEMORY); |
334 | usb_free_urb (urb); | 335 | usb_free_urb (urb); |
335 | return -ENOMEM; | 336 | return -ENOMEM; |
336 | } | 337 | } |
337 | skb_reserve (skb, NET_IP_ALIGN); | ||
338 | 338 | ||
339 | entry = (struct skb_data *) skb->cb; | 339 | entry = (struct skb_data *) skb->cb; |
340 | entry->urb = urb; | 340 | entry->urb = urb; |
diff --git a/drivers/net/wimax/i2400m/netdev.c b/drivers/net/wimax/i2400m/netdev.c index 64a110604ad..63e4b709efa 100644 --- a/drivers/net/wimax/i2400m/netdev.c +++ b/drivers/net/wimax/i2400m/netdev.c | |||
@@ -367,38 +367,28 @@ netdev_tx_t i2400m_hard_start_xmit(struct sk_buff *skb, | |||
367 | { | 367 | { |
368 | struct i2400m *i2400m = net_dev_to_i2400m(net_dev); | 368 | struct i2400m *i2400m = net_dev_to_i2400m(net_dev); |
369 | struct device *dev = i2400m_dev(i2400m); | 369 | struct device *dev = i2400m_dev(i2400m); |
370 | int result; | 370 | int result = -1; |
371 | 371 | ||
372 | d_fnstart(3, dev, "(skb %p net_dev %p)\n", skb, net_dev); | 372 | d_fnstart(3, dev, "(skb %p net_dev %p)\n", skb, net_dev); |
373 | if (skb_header_cloned(skb)) { | 373 | |
374 | /* | 374 | if (skb_header_cloned(skb) && |
375 | * Make tcpdump/wireshark happy -- if they are | 375 | pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) |
376 | * running, the skb is cloned and we will overwrite | 376 | goto drop; |
377 | * the mac fields in i2400m_tx_prep_header. Expand | ||
378 | * seems to fix this... | ||
379 | */ | ||
380 | result = pskb_expand_head(skb, 0, 0, GFP_ATOMIC); | ||
381 | if (result) { | ||
382 | result = NETDEV_TX_BUSY; | ||
383 | goto error_expand; | ||
384 | } | ||
385 | } | ||
386 | 377 | ||
387 | if (i2400m->state == I2400M_SS_IDLE) | 378 | if (i2400m->state == I2400M_SS_IDLE) |
388 | result = i2400m_net_wake_tx(i2400m, net_dev, skb); | 379 | result = i2400m_net_wake_tx(i2400m, net_dev, skb); |
389 | else | 380 | else |
390 | result = i2400m_net_tx(i2400m, net_dev, skb); | 381 | result = i2400m_net_tx(i2400m, net_dev, skb); |
391 | if (result < 0) | 382 | if (result < 0) { |
383 | drop: | ||
392 | net_dev->stats.tx_dropped++; | 384 | net_dev->stats.tx_dropped++; |
393 | else { | 385 | } else { |
394 | net_dev->stats.tx_packets++; | 386 | net_dev->stats.tx_packets++; |
395 | net_dev->stats.tx_bytes += skb->len; | 387 | net_dev->stats.tx_bytes += skb->len; |
396 | } | 388 | } |
397 | result = NETDEV_TX_OK; | 389 | dev_kfree_skb(skb); |
398 | error_expand: | ||
399 | kfree_skb(skb); | ||
400 | d_fnend(3, dev, "(skb %p net_dev %p) = %d\n", skb, net_dev, result); | 390 | d_fnend(3, dev, "(skb %p net_dev %p) = %d\n", skb, net_dev, result); |
401 | return result; | 391 | return NETDEV_TX_OK; |
402 | } | 392 | } |
403 | 393 | ||
404 | 394 | ||
diff --git a/drivers/net/wireless/iwlegacy/3945-mac.c b/drivers/net/wireless/iwlegacy/3945-mac.c index 54b2d391e91..a7dfba8d164 100644 --- a/drivers/net/wireless/iwlegacy/3945-mac.c +++ b/drivers/net/wireless/iwlegacy/3945-mac.c | |||
@@ -2475,7 +2475,7 @@ il3945_bg_alive_start(struct work_struct *data) | |||
2475 | container_of(data, struct il_priv, alive_start.work); | 2475 | container_of(data, struct il_priv, alive_start.work); |
2476 | 2476 | ||
2477 | mutex_lock(&il->mutex); | 2477 | mutex_lock(&il->mutex); |
2478 | if (test_bit(S_EXIT_PENDING, &il->status)) | 2478 | if (test_bit(S_EXIT_PENDING, &il->status) || il->txq == NULL) |
2479 | goto out; | 2479 | goto out; |
2480 | 2480 | ||
2481 | il3945_alive_start(il); | 2481 | il3945_alive_start(il); |
diff --git a/drivers/net/wireless/iwlegacy/3945.c b/drivers/net/wireless/iwlegacy/3945.c index 1489b1573a6..c80eb9b3155 100644 --- a/drivers/net/wireless/iwlegacy/3945.c +++ b/drivers/net/wireless/iwlegacy/3945.c | |||
@@ -1870,11 +1870,12 @@ il3945_bg_reg_txpower_periodic(struct work_struct *work) | |||
1870 | struct il_priv *il = container_of(work, struct il_priv, | 1870 | struct il_priv *il = container_of(work, struct il_priv, |
1871 | _3945.thermal_periodic.work); | 1871 | _3945.thermal_periodic.work); |
1872 | 1872 | ||
1873 | if (test_bit(S_EXIT_PENDING, &il->status)) | ||
1874 | return; | ||
1875 | |||
1876 | mutex_lock(&il->mutex); | 1873 | mutex_lock(&il->mutex); |
1874 | if (test_bit(S_EXIT_PENDING, &il->status) || il->txq == NULL) | ||
1875 | goto out; | ||
1876 | |||
1877 | il3945_reg_txpower_periodic(il); | 1877 | il3945_reg_txpower_periodic(il); |
1878 | out: | ||
1878 | mutex_unlock(&il->mutex); | 1879 | mutex_unlock(&il->mutex); |
1879 | } | 1880 | } |
1880 | 1881 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index d2a1ea98d0f..fd356b7c047 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
@@ -426,10 +426,14 @@ void rt2x00lib_txdone(struct queue_entry *entry, | |||
426 | /* | 426 | /* |
427 | * If the data queue was below the threshold before the txdone | 427 | * If the data queue was below the threshold before the txdone |
428 | * handler we must make sure the packet queue in the mac80211 stack | 428 | * handler we must make sure the packet queue in the mac80211 stack |
429 | * is reenabled when the txdone handler has finished. | 429 | * is reenabled when the txdone handler has finished. This has to be |
430 | * serialized with rt2x00mac_tx(), otherwise we can wake up queue | ||
431 | * before it was stopped. | ||
430 | */ | 432 | */ |
433 | spin_lock_bh(&entry->queue->tx_lock); | ||
431 | if (!rt2x00queue_threshold(entry->queue)) | 434 | if (!rt2x00queue_threshold(entry->queue)) |
432 | rt2x00queue_unpause_queue(entry->queue); | 435 | rt2x00queue_unpause_queue(entry->queue); |
436 | spin_unlock_bh(&entry->queue->tx_lock); | ||
433 | } | 437 | } |
434 | EXPORT_SYMBOL_GPL(rt2x00lib_txdone); | 438 | EXPORT_SYMBOL_GPL(rt2x00lib_txdone); |
435 | 439 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c index ede3c58e678..2df2eb6d3e0 100644 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c | |||
@@ -152,13 +152,22 @@ void rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
152 | if (unlikely(rt2x00queue_write_tx_frame(queue, skb, false))) | 152 | if (unlikely(rt2x00queue_write_tx_frame(queue, skb, false))) |
153 | goto exit_fail; | 153 | goto exit_fail; |
154 | 154 | ||
155 | /* | ||
156 | * Pausing queue has to be serialized with rt2x00lib_txdone(). Note | ||
157 | * we should not use spin_lock_bh variant as bottom halve was already | ||
158 | * disabled before ieee80211_xmit() call. | ||
159 | */ | ||
160 | spin_lock(&queue->tx_lock); | ||
155 | if (rt2x00queue_threshold(queue)) | 161 | if (rt2x00queue_threshold(queue)) |
156 | rt2x00queue_pause_queue(queue); | 162 | rt2x00queue_pause_queue(queue); |
163 | spin_unlock(&queue->tx_lock); | ||
157 | 164 | ||
158 | return; | 165 | return; |
159 | 166 | ||
160 | exit_fail: | 167 | exit_fail: |
168 | spin_lock(&queue->tx_lock); | ||
161 | rt2x00queue_pause_queue(queue); | 169 | rt2x00queue_pause_queue(queue); |
170 | spin_unlock(&queue->tx_lock); | ||
162 | exit_free_skb: | 171 | exit_free_skb: |
163 | ieee80211_free_txskb(hw, skb); | 172 | ieee80211_free_txskb(hw, skb); |
164 | } | 173 | } |
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index 5adfb3eab9c..9b1b2b7a780 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | |||
@@ -619,6 +619,9 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, | |||
619 | else if (test_bit(REQUIRE_DMA, &queue->rt2x00dev->cap_flags)) | 619 | else if (test_bit(REQUIRE_DMA, &queue->rt2x00dev->cap_flags)) |
620 | rt2x00queue_align_frame(skb); | 620 | rt2x00queue_align_frame(skb); |
621 | 621 | ||
622 | /* | ||
623 | * That function must be called with bh disabled. | ||
624 | */ | ||
622 | spin_lock(&queue->tx_lock); | 625 | spin_lock(&queue->tx_lock); |
623 | 626 | ||
624 | if (unlikely(rt2x00queue_full(queue))) { | 627 | if (unlikely(rt2x00queue_full(queue))) { |
diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index 1cfbf228fbb..24f049e7395 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c | |||
@@ -500,6 +500,9 @@ static int pcie_aspm_sanity_check(struct pci_dev *pdev) | |||
500 | int pos; | 500 | int pos; |
501 | u32 reg32; | 501 | u32 reg32; |
502 | 502 | ||
503 | if (aspm_disabled) | ||
504 | return 0; | ||
505 | |||
503 | /* | 506 | /* |
504 | * Some functions in a slot might not all be PCIe functions, | 507 | * Some functions in a slot might not all be PCIe functions, |
505 | * very strange. Disable ASPM for the whole slot | 508 | * very strange. Disable ASPM for the whole slot |
diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig index f995e6e2f78..15dbd8cc445 100644 --- a/drivers/platform/x86/Kconfig +++ b/drivers/platform/x86/Kconfig | |||
@@ -143,6 +143,30 @@ config FUJITSU_LAPTOP_DEBUG | |||
143 | 143 | ||
144 | If you are not sure, say N here. | 144 | If you are not sure, say N here. |
145 | 145 | ||
146 | config FUJITSU_TABLET | ||
147 | tristate "Fujitsu Tablet Extras" | ||
148 | depends on ACPI | ||
149 | depends on INPUT | ||
150 | ---help--- | ||
151 | This is a driver for tablets built by Fujitsu: | ||
152 | |||
153 | * Lifebook P1510/P1610/P1620/Txxxx | ||
154 | * Stylistic ST5xxx | ||
155 | * Possibly other Fujitsu tablet models | ||
156 | |||
157 | It adds support for the panel buttons, docking station detection, | ||
158 | tablet/notebook mode detection for convertible and | ||
159 | orientation detection for docked slates. | ||
160 | |||
161 | If you have a Fujitsu convertible or slate, say Y or M here. | ||
162 | |||
163 | config AMILO_RFKILL | ||
164 | tristate "Fujitsu-Siemens Amilo rfkill support" | ||
165 | depends on RFKILL | ||
166 | ---help--- | ||
167 | This is a driver for enabling wifi on some Fujitsu-Siemens Amilo | ||
168 | laptops. | ||
169 | |||
146 | config TC1100_WMI | 170 | config TC1100_WMI |
147 | tristate "HP Compaq TC1100 Tablet WMI Extras (EXPERIMENTAL)" | 171 | tristate "HP Compaq TC1100 Tablet WMI Extras (EXPERIMENTAL)" |
148 | depends on !X86_64 | 172 | depends on !X86_64 |
diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile index 293a320d9fa..d328f21e9fd 100644 --- a/drivers/platform/x86/Makefile +++ b/drivers/platform/x86/Makefile | |||
@@ -17,12 +17,14 @@ obj-$(CONFIG_ACER_WMI) += acer-wmi.o | |||
17 | obj-$(CONFIG_ACERHDF) += acerhdf.o | 17 | obj-$(CONFIG_ACERHDF) += acerhdf.o |
18 | obj-$(CONFIG_HP_ACCEL) += hp_accel.o | 18 | obj-$(CONFIG_HP_ACCEL) += hp_accel.o |
19 | obj-$(CONFIG_HP_WMI) += hp-wmi.o | 19 | obj-$(CONFIG_HP_WMI) += hp-wmi.o |
20 | obj-$(CONFIG_AMILO_RFKILL) += amilo-rfkill.o | ||
20 | obj-$(CONFIG_TC1100_WMI) += tc1100-wmi.o | 21 | obj-$(CONFIG_TC1100_WMI) += tc1100-wmi.o |
21 | obj-$(CONFIG_SONY_LAPTOP) += sony-laptop.o | 22 | obj-$(CONFIG_SONY_LAPTOP) += sony-laptop.o |
22 | obj-$(CONFIG_IDEAPAD_LAPTOP) += ideapad-laptop.o | 23 | obj-$(CONFIG_IDEAPAD_LAPTOP) += ideapad-laptop.o |
23 | obj-$(CONFIG_THINKPAD_ACPI) += thinkpad_acpi.o | 24 | obj-$(CONFIG_THINKPAD_ACPI) += thinkpad_acpi.o |
24 | obj-$(CONFIG_SENSORS_HDAPS) += hdaps.o | 25 | obj-$(CONFIG_SENSORS_HDAPS) += hdaps.o |
25 | obj-$(CONFIG_FUJITSU_LAPTOP) += fujitsu-laptop.o | 26 | obj-$(CONFIG_FUJITSU_LAPTOP) += fujitsu-laptop.o |
27 | obj-$(CONFIG_FUJITSU_TABLET) += fujitsu-tablet.o | ||
26 | obj-$(CONFIG_PANASONIC_LAPTOP) += panasonic-laptop.o | 28 | obj-$(CONFIG_PANASONIC_LAPTOP) += panasonic-laptop.o |
27 | obj-$(CONFIG_INTEL_MENLOW) += intel_menlow.o | 29 | obj-$(CONFIG_INTEL_MENLOW) += intel_menlow.o |
28 | obj-$(CONFIG_ACPI_WMI) += wmi.o | 30 | obj-$(CONFIG_ACPI_WMI) += wmi.o |
diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c index b848277171a..1e5290b5396 100644 --- a/drivers/platform/x86/acer-wmi.c +++ b/drivers/platform/x86/acer-wmi.c | |||
@@ -679,6 +679,32 @@ static acpi_status AMW0_find_mailled(void) | |||
679 | return AE_OK; | 679 | return AE_OK; |
680 | } | 680 | } |
681 | 681 | ||
682 | static int AMW0_set_cap_acpi_check_device_found; | ||
683 | |||
684 | static acpi_status AMW0_set_cap_acpi_check_device_cb(acpi_handle handle, | ||
685 | u32 level, void *context, void **retval) | ||
686 | { | ||
687 | AMW0_set_cap_acpi_check_device_found = 1; | ||
688 | return AE_OK; | ||
689 | } | ||
690 | |||
691 | static const struct acpi_device_id norfkill_ids[] = { | ||
692 | { "VPC2004", 0}, | ||
693 | { "IBM0068", 0}, | ||
694 | { "LEN0068", 0}, | ||
695 | { "", 0}, | ||
696 | }; | ||
697 | |||
698 | static int AMW0_set_cap_acpi_check_device(void) | ||
699 | { | ||
700 | const struct acpi_device_id *id; | ||
701 | |||
702 | for (id = norfkill_ids; id->id[0]; id++) | ||
703 | acpi_get_devices(id->id, AMW0_set_cap_acpi_check_device_cb, | ||
704 | NULL, NULL); | ||
705 | return AMW0_set_cap_acpi_check_device_found; | ||
706 | } | ||
707 | |||
682 | static acpi_status AMW0_set_capabilities(void) | 708 | static acpi_status AMW0_set_capabilities(void) |
683 | { | 709 | { |
684 | struct wmab_args args; | 710 | struct wmab_args args; |
@@ -692,7 +718,9 @@ static acpi_status AMW0_set_capabilities(void) | |||
692 | * work. | 718 | * work. |
693 | */ | 719 | */ |
694 | if (wmi_has_guid(AMW0_GUID2)) { | 720 | if (wmi_has_guid(AMW0_GUID2)) { |
695 | interface->capability |= ACER_CAP_WIRELESS; | 721 | if ((quirks != &quirk_unknown) || |
722 | !AMW0_set_cap_acpi_check_device()) | ||
723 | interface->capability |= ACER_CAP_WIRELESS; | ||
696 | return AE_OK; | 724 | return AE_OK; |
697 | } | 725 | } |
698 | 726 | ||
diff --git a/drivers/platform/x86/amilo-rfkill.c b/drivers/platform/x86/amilo-rfkill.c new file mode 100644 index 00000000000..19170bb7700 --- /dev/null +++ b/drivers/platform/x86/amilo-rfkill.c | |||
@@ -0,0 +1,173 @@ | |||
1 | /* | ||
2 | * Support for rfkill on some Fujitsu-Siemens Amilo laptops. | ||
3 | * Copyright 2011 Ben Hutchings. | ||
4 | * | ||
5 | * Based in part on the fsam7440 driver, which is: | ||
6 | * Copyright 2005 Alejandro Vidal Mata & Javier Vidal Mata. | ||
7 | * and on the fsaa1655g driver, which is: | ||
8 | * Copyright 2006 Martin Večeřa. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License as published by | ||
12 | * the Free Software Foundation; either version 2 of the License, or | ||
13 | * (at your option) any later version. | ||
14 | */ | ||
15 | |||
16 | #include <linux/module.h> | ||
17 | #include <linux/dmi.h> | ||
18 | #include <linux/i8042.h> | ||
19 | #include <linux/io.h> | ||
20 | #include <linux/moduleparam.h> | ||
21 | #include <linux/platform_device.h> | ||
22 | #include <linux/rfkill.h> | ||
23 | |||
24 | /* | ||
25 | * These values were obtained from disassembling and debugging the | ||
26 | * PM.exe program installed in the Fujitsu-Siemens AMILO A1655G | ||
27 | */ | ||
28 | #define A1655_WIFI_COMMAND 0x10C5 | ||
29 | #define A1655_WIFI_ON 0x25 | ||
30 | #define A1655_WIFI_OFF 0x45 | ||
31 | |||
32 | static int amilo_a1655_rfkill_set_block(void *data, bool blocked) | ||
33 | { | ||
34 | u8 param = blocked ? A1655_WIFI_OFF : A1655_WIFI_ON; | ||
35 | int rc; | ||
36 | |||
37 | i8042_lock_chip(); | ||
38 | rc = i8042_command(¶m, A1655_WIFI_COMMAND); | ||
39 | i8042_unlock_chip(); | ||
40 | return rc; | ||
41 | } | ||
42 | |||
43 | static const struct rfkill_ops amilo_a1655_rfkill_ops = { | ||
44 | .set_block = amilo_a1655_rfkill_set_block | ||
45 | }; | ||
46 | |||
47 | /* | ||
48 | * These values were obtained from disassembling the PM.exe program | ||
49 | * installed in the Fujitsu-Siemens AMILO M 7440 | ||
50 | */ | ||
51 | #define M7440_PORT1 0x118f | ||
52 | #define M7440_PORT2 0x118e | ||
53 | #define M7440_RADIO_ON1 0x12 | ||
54 | #define M7440_RADIO_ON2 0x80 | ||
55 | #define M7440_RADIO_OFF1 0x10 | ||
56 | #define M7440_RADIO_OFF2 0x00 | ||
57 | |||
58 | static int amilo_m7440_rfkill_set_block(void *data, bool blocked) | ||
59 | { | ||
60 | u8 val1 = blocked ? M7440_RADIO_OFF1 : M7440_RADIO_ON1; | ||
61 | u8 val2 = blocked ? M7440_RADIO_OFF2 : M7440_RADIO_ON2; | ||
62 | |||
63 | outb(val1, M7440_PORT1); | ||
64 | outb(val2, M7440_PORT2); | ||
65 | |||
66 | /* Check whether the state has changed correctly */ | ||
67 | if (inb(M7440_PORT1) != val1 || inb(M7440_PORT2) != val2) | ||
68 | return -EIO; | ||
69 | |||
70 | return 0; | ||
71 | } | ||
72 | |||
73 | static const struct rfkill_ops amilo_m7440_rfkill_ops = { | ||
74 | .set_block = amilo_m7440_rfkill_set_block | ||
75 | }; | ||
76 | |||
77 | static const struct dmi_system_id __devinitdata amilo_rfkill_id_table[] = { | ||
78 | { | ||
79 | .matches = { | ||
80 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
81 | DMI_MATCH(DMI_BOARD_NAME, "AMILO A1655"), | ||
82 | }, | ||
83 | .driver_data = (void *)&amilo_a1655_rfkill_ops | ||
84 | }, | ||
85 | { | ||
86 | .matches = { | ||
87 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
88 | DMI_MATCH(DMI_BOARD_NAME, "AMILO M7440"), | ||
89 | }, | ||
90 | .driver_data = (void *)&amilo_m7440_rfkill_ops | ||
91 | }, | ||
92 | {} | ||
93 | }; | ||
94 | |||
95 | static struct platform_device *amilo_rfkill_pdev; | ||
96 | static struct rfkill *amilo_rfkill_dev; | ||
97 | |||
98 | static int __devinit amilo_rfkill_probe(struct platform_device *device) | ||
99 | { | ||
100 | const struct dmi_system_id *system_id = | ||
101 | dmi_first_match(amilo_rfkill_id_table); | ||
102 | int rc; | ||
103 | |||
104 | amilo_rfkill_dev = rfkill_alloc(KBUILD_MODNAME, &device->dev, | ||
105 | RFKILL_TYPE_WLAN, | ||
106 | system_id->driver_data, NULL); | ||
107 | if (!amilo_rfkill_dev) | ||
108 | return -ENOMEM; | ||
109 | |||
110 | rc = rfkill_register(amilo_rfkill_dev); | ||
111 | if (rc) | ||
112 | goto fail; | ||
113 | |||
114 | return 0; | ||
115 | |||
116 | fail: | ||
117 | rfkill_destroy(amilo_rfkill_dev); | ||
118 | return rc; | ||
119 | } | ||
120 | |||
121 | static int amilo_rfkill_remove(struct platform_device *device) | ||
122 | { | ||
123 | rfkill_unregister(amilo_rfkill_dev); | ||
124 | rfkill_destroy(amilo_rfkill_dev); | ||
125 | return 0; | ||
126 | } | ||
127 | |||
128 | static struct platform_driver amilo_rfkill_driver = { | ||
129 | .driver = { | ||
130 | .name = KBUILD_MODNAME, | ||
131 | .owner = THIS_MODULE, | ||
132 | }, | ||
133 | .probe = amilo_rfkill_probe, | ||
134 | .remove = amilo_rfkill_remove, | ||
135 | }; | ||
136 | |||
137 | static int __init amilo_rfkill_init(void) | ||
138 | { | ||
139 | int rc; | ||
140 | |||
141 | if (dmi_first_match(amilo_rfkill_id_table) == NULL) | ||
142 | return -ENODEV; | ||
143 | |||
144 | rc = platform_driver_register(&amilo_rfkill_driver); | ||
145 | if (rc) | ||
146 | return rc; | ||
147 | |||
148 | amilo_rfkill_pdev = platform_device_register_simple(KBUILD_MODNAME, -1, | ||
149 | NULL, 0); | ||
150 | if (IS_ERR(amilo_rfkill_pdev)) { | ||
151 | rc = PTR_ERR(amilo_rfkill_pdev); | ||
152 | goto fail; | ||
153 | } | ||
154 | |||
155 | return 0; | ||
156 | |||
157 | fail: | ||
158 | platform_driver_unregister(&amilo_rfkill_driver); | ||
159 | return rc; | ||
160 | } | ||
161 | |||
162 | static void __exit amilo_rfkill_exit(void) | ||
163 | { | ||
164 | platform_device_unregister(amilo_rfkill_pdev); | ||
165 | platform_driver_unregister(&amilo_rfkill_driver); | ||
166 | } | ||
167 | |||
168 | MODULE_AUTHOR("Ben Hutchings <ben@decadent.org.uk>"); | ||
169 | MODULE_LICENSE("GPL"); | ||
170 | MODULE_DEVICE_TABLE(dmi, amilo_rfkill_id_table); | ||
171 | |||
172 | module_init(amilo_rfkill_init); | ||
173 | module_exit(amilo_rfkill_exit); | ||
diff --git a/drivers/platform/x86/fujitsu-tablet.c b/drivers/platform/x86/fujitsu-tablet.c new file mode 100644 index 00000000000..580d80a73c3 --- /dev/null +++ b/drivers/platform/x86/fujitsu-tablet.c | |||
@@ -0,0 +1,478 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2006-2012 Robert Gerlach <khnz@gmx.de> | ||
3 | * Copyright (C) 2005-2006 Jan Rychter <jan@rychter.com> | ||
4 | * | ||
5 | * You can redistribute and/or modify this program under the terms of the | ||
6 | * GNU General Public License version 2 as published by the Free Software | ||
7 | * Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, but | ||
10 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ||
12 | * Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License along | ||
15 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
16 | * 59 Temple Place Suite 330, Boston, MA 02111-1307, USA. | ||
17 | */ | ||
18 | |||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/module.h> | ||
21 | #include <linux/init.h> | ||
22 | #include <linux/bitops.h> | ||
23 | #include <linux/io.h> | ||
24 | #include <linux/ioport.h> | ||
25 | #include <linux/acpi.h> | ||
26 | #include <linux/device.h> | ||
27 | #include <linux/interrupt.h> | ||
28 | #include <linux/input.h> | ||
29 | #include <linux/delay.h> | ||
30 | #include <linux/dmi.h> | ||
31 | |||
32 | #define MODULENAME "fujitsu-tablet" | ||
33 | |||
34 | #define ACPI_FUJITSU_CLASS "fujitsu" | ||
35 | |||
36 | #define INVERT_TABLET_MODE_BIT 0x01 | ||
37 | #define FORCE_TABLET_MODE_IF_UNDOCK 0x02 | ||
38 | |||
39 | #define KEYMAP_LEN 16 | ||
40 | |||
41 | static const struct acpi_device_id fujitsu_ids[] = { | ||
42 | { .id = "FUJ02BD" }, | ||
43 | { .id = "FUJ02BF" }, | ||
44 | { .id = "" } | ||
45 | }; | ||
46 | |||
47 | struct fujitsu_config { | ||
48 | unsigned short keymap[KEYMAP_LEN]; | ||
49 | unsigned int quirks; | ||
50 | }; | ||
51 | |||
52 | static unsigned short keymap_Lifebook_Tseries[KEYMAP_LEN] __initconst = { | ||
53 | KEY_RESERVED, | ||
54 | KEY_RESERVED, | ||
55 | KEY_RESERVED, | ||
56 | KEY_RESERVED, | ||
57 | KEY_SCROLLDOWN, | ||
58 | KEY_SCROLLUP, | ||
59 | KEY_DIRECTION, | ||
60 | KEY_LEFTCTRL, | ||
61 | KEY_BRIGHTNESSUP, | ||
62 | KEY_BRIGHTNESSDOWN, | ||
63 | KEY_BRIGHTNESS_ZERO, | ||
64 | KEY_RESERVED, | ||
65 | KEY_RESERVED, | ||
66 | KEY_RESERVED, | ||
67 | KEY_RESERVED, | ||
68 | KEY_LEFTALT | ||
69 | }; | ||
70 | |||
71 | static unsigned short keymap_Lifebook_U810[KEYMAP_LEN] __initconst = { | ||
72 | KEY_RESERVED, | ||
73 | KEY_RESERVED, | ||
74 | KEY_RESERVED, | ||
75 | KEY_RESERVED, | ||
76 | KEY_PROG1, | ||
77 | KEY_PROG2, | ||
78 | KEY_DIRECTION, | ||
79 | KEY_RESERVED, | ||
80 | KEY_RESERVED, | ||
81 | KEY_RESERVED, | ||
82 | KEY_UP, | ||
83 | KEY_DOWN, | ||
84 | KEY_RESERVED, | ||
85 | KEY_RESERVED, | ||
86 | KEY_LEFTCTRL, | ||
87 | KEY_LEFTALT | ||
88 | }; | ||
89 | |||
90 | static unsigned short keymap_Stylistic_Tseries[KEYMAP_LEN] __initconst = { | ||
91 | KEY_RESERVED, | ||
92 | KEY_RESERVED, | ||
93 | KEY_RESERVED, | ||
94 | KEY_RESERVED, | ||
95 | KEY_PRINT, | ||
96 | KEY_BACKSPACE, | ||
97 | KEY_SPACE, | ||
98 | KEY_ENTER, | ||
99 | KEY_BRIGHTNESSUP, | ||
100 | KEY_BRIGHTNESSDOWN, | ||
101 | KEY_DOWN, | ||
102 | KEY_UP, | ||
103 | KEY_SCROLLUP, | ||
104 | KEY_SCROLLDOWN, | ||
105 | KEY_LEFTCTRL, | ||
106 | KEY_LEFTALT | ||
107 | }; | ||
108 | |||
109 | static unsigned short keymap_Stylistic_ST5xxx[KEYMAP_LEN] __initconst = { | ||
110 | KEY_RESERVED, | ||
111 | KEY_RESERVED, | ||
112 | KEY_RESERVED, | ||
113 | KEY_RESERVED, | ||
114 | KEY_MAIL, | ||
115 | KEY_DIRECTION, | ||
116 | KEY_ESC, | ||
117 | KEY_ENTER, | ||
118 | KEY_BRIGHTNESSUP, | ||
119 | KEY_BRIGHTNESSDOWN, | ||
120 | KEY_DOWN, | ||
121 | KEY_UP, | ||
122 | KEY_SCROLLUP, | ||
123 | KEY_SCROLLDOWN, | ||
124 | KEY_LEFTCTRL, | ||
125 | KEY_LEFTALT | ||
126 | }; | ||
127 | |||
128 | static struct { | ||
129 | struct input_dev *idev; | ||
130 | struct fujitsu_config config; | ||
131 | unsigned long prev_keymask; | ||
132 | |||
133 | char phys[21]; | ||
134 | |||
135 | int irq; | ||
136 | int io_base; | ||
137 | int io_length; | ||
138 | } fujitsu; | ||
139 | |||
140 | static u8 fujitsu_ack(void) | ||
141 | { | ||
142 | return inb(fujitsu.io_base + 2); | ||
143 | } | ||
144 | |||
145 | static u8 fujitsu_status(void) | ||
146 | { | ||
147 | return inb(fujitsu.io_base + 6); | ||
148 | } | ||
149 | |||
150 | static u8 fujitsu_read_register(const u8 addr) | ||
151 | { | ||
152 | outb(addr, fujitsu.io_base); | ||
153 | return inb(fujitsu.io_base + 4); | ||
154 | } | ||
155 | |||
156 | static void fujitsu_send_state(void) | ||
157 | { | ||
158 | int state; | ||
159 | int dock, tablet_mode; | ||
160 | |||
161 | state = fujitsu_read_register(0xdd); | ||
162 | |||
163 | dock = state & 0x02; | ||
164 | |||
165 | if ((fujitsu.config.quirks & FORCE_TABLET_MODE_IF_UNDOCK) && (!dock)) { | ||
166 | tablet_mode = 1; | ||
167 | } else{ | ||
168 | tablet_mode = state & 0x01; | ||
169 | if (fujitsu.config.quirks & INVERT_TABLET_MODE_BIT) | ||
170 | tablet_mode = !tablet_mode; | ||
171 | } | ||
172 | |||
173 | input_report_switch(fujitsu.idev, SW_DOCK, dock); | ||
174 | input_report_switch(fujitsu.idev, SW_TABLET_MODE, tablet_mode); | ||
175 | input_sync(fujitsu.idev); | ||
176 | } | ||
177 | |||
178 | static void fujitsu_reset(void) | ||
179 | { | ||
180 | int timeout = 50; | ||
181 | |||
182 | fujitsu_ack(); | ||
183 | |||
184 | while ((fujitsu_status() & 0x02) && (--timeout)) | ||
185 | msleep(20); | ||
186 | |||
187 | fujitsu_send_state(); | ||
188 | } | ||
189 | |||
190 | static int __devinit input_fujitsu_setup(struct device *parent, | ||
191 | const char *name, const char *phys) | ||
192 | { | ||
193 | struct input_dev *idev; | ||
194 | int error; | ||
195 | int i; | ||
196 | |||
197 | idev = input_allocate_device(); | ||
198 | if (!idev) | ||
199 | return -ENOMEM; | ||
200 | |||
201 | idev->dev.parent = parent; | ||
202 | idev->phys = phys; | ||
203 | idev->name = name; | ||
204 | idev->id.bustype = BUS_HOST; | ||
205 | idev->id.vendor = 0x1734; /* Fujitsu Siemens Computer GmbH */ | ||
206 | idev->id.product = 0x0001; | ||
207 | idev->id.version = 0x0101; | ||
208 | |||
209 | idev->keycode = fujitsu.config.keymap; | ||
210 | idev->keycodesize = sizeof(fujitsu.config.keymap[0]); | ||
211 | idev->keycodemax = ARRAY_SIZE(fujitsu.config.keymap); | ||
212 | |||
213 | __set_bit(EV_REP, idev->evbit); | ||
214 | |||
215 | for (i = 0; i < ARRAY_SIZE(fujitsu.config.keymap); i++) | ||
216 | if (fujitsu.config.keymap[i]) | ||
217 | input_set_capability(idev, EV_KEY, fujitsu.config.keymap[i]); | ||
218 | |||
219 | input_set_capability(idev, EV_MSC, MSC_SCAN); | ||
220 | |||
221 | input_set_capability(idev, EV_SW, SW_DOCK); | ||
222 | input_set_capability(idev, EV_SW, SW_TABLET_MODE); | ||
223 | |||
224 | input_set_capability(idev, EV_SW, SW_DOCK); | ||
225 | input_set_capability(idev, EV_SW, SW_TABLET_MODE); | ||
226 | |||
227 | error = input_register_device(idev); | ||
228 | if (error) { | ||
229 | input_free_device(idev); | ||
230 | return error; | ||
231 | } | ||
232 | |||
233 | fujitsu.idev = idev; | ||
234 | return 0; | ||
235 | } | ||
236 | |||
237 | static void input_fujitsu_remove(void) | ||
238 | { | ||
239 | input_unregister_device(fujitsu.idev); | ||
240 | } | ||
241 | |||
242 | static irqreturn_t fujitsu_interrupt(int irq, void *dev_id) | ||
243 | { | ||
244 | unsigned long keymask, changed; | ||
245 | unsigned int keycode; | ||
246 | int pressed; | ||
247 | int i; | ||
248 | |||
249 | if (unlikely(!(fujitsu_status() & 0x01))) | ||
250 | return IRQ_NONE; | ||
251 | |||
252 | fujitsu_send_state(); | ||
253 | |||
254 | keymask = fujitsu_read_register(0xde); | ||
255 | keymask |= fujitsu_read_register(0xdf) << 8; | ||
256 | keymask ^= 0xffff; | ||
257 | |||
258 | changed = keymask ^ fujitsu.prev_keymask; | ||
259 | if (changed) { | ||
260 | fujitsu.prev_keymask = keymask; | ||
261 | |||
262 | for_each_set_bit(i, &changed, KEYMAP_LEN) { | ||
263 | keycode = fujitsu.config.keymap[i]; | ||
264 | pressed = keymask & changed & BIT(i); | ||
265 | |||
266 | if (pressed) | ||
267 | input_event(fujitsu.idev, EV_MSC, MSC_SCAN, i); | ||
268 | |||
269 | input_report_key(fujitsu.idev, keycode, pressed); | ||
270 | input_sync(fujitsu.idev); | ||
271 | } | ||
272 | } | ||
273 | |||
274 | fujitsu_ack(); | ||
275 | return IRQ_HANDLED; | ||
276 | } | ||
277 | |||
278 | static int __devinit fujitsu_dmi_default(const struct dmi_system_id *dmi) | ||
279 | { | ||
280 | printk(KERN_INFO MODULENAME ": %s\n", dmi->ident); | ||
281 | memcpy(fujitsu.config.keymap, dmi->driver_data, | ||
282 | sizeof(fujitsu.config.keymap)); | ||
283 | return 1; | ||
284 | } | ||
285 | |||
286 | static int __devinit fujitsu_dmi_stylistic(const struct dmi_system_id *dmi) | ||
287 | { | ||
288 | fujitsu_dmi_default(dmi); | ||
289 | fujitsu.config.quirks |= FORCE_TABLET_MODE_IF_UNDOCK; | ||
290 | fujitsu.config.quirks |= INVERT_TABLET_MODE_BIT; | ||
291 | return 1; | ||
292 | } | ||
293 | |||
294 | static struct dmi_system_id dmi_ids[] __initconst = { | ||
295 | { | ||
296 | .callback = fujitsu_dmi_default, | ||
297 | .ident = "Fujitsu Siemens P/T Series", | ||
298 | .matches = { | ||
299 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
300 | DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK") | ||
301 | }, | ||
302 | .driver_data = keymap_Lifebook_Tseries | ||
303 | }, | ||
304 | { | ||
305 | .callback = fujitsu_dmi_default, | ||
306 | .ident = "Fujitsu Lifebook T Series", | ||
307 | .matches = { | ||
308 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
309 | DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook T") | ||
310 | }, | ||
311 | .driver_data = keymap_Lifebook_Tseries | ||
312 | }, | ||
313 | { | ||
314 | .callback = fujitsu_dmi_stylistic, | ||
315 | .ident = "Fujitsu Siemens Stylistic T Series", | ||
316 | .matches = { | ||
317 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
318 | DMI_MATCH(DMI_PRODUCT_NAME, "Stylistic T") | ||
319 | }, | ||
320 | .driver_data = keymap_Stylistic_Tseries | ||
321 | }, | ||
322 | { | ||
323 | .callback = fujitsu_dmi_default, | ||
324 | .ident = "Fujitsu LifeBook U810", | ||
325 | .matches = { | ||
326 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
327 | DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook U810") | ||
328 | }, | ||
329 | .driver_data = keymap_Lifebook_U810 | ||
330 | }, | ||
331 | { | ||
332 | .callback = fujitsu_dmi_stylistic, | ||
333 | .ident = "Fujitsu Siemens Stylistic ST5xxx Series", | ||
334 | .matches = { | ||
335 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
336 | DMI_MATCH(DMI_PRODUCT_NAME, "STYLISTIC ST5") | ||
337 | }, | ||
338 | .driver_data = keymap_Stylistic_ST5xxx | ||
339 | }, | ||
340 | { | ||
341 | .callback = fujitsu_dmi_stylistic, | ||
342 | .ident = "Fujitsu Siemens Stylistic ST5xxx Series", | ||
343 | .matches = { | ||
344 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
345 | DMI_MATCH(DMI_PRODUCT_NAME, "Stylistic ST5") | ||
346 | }, | ||
347 | .driver_data = keymap_Stylistic_ST5xxx | ||
348 | }, | ||
349 | { | ||
350 | .callback = fujitsu_dmi_default, | ||
351 | .ident = "Unknown (using defaults)", | ||
352 | .matches = { | ||
353 | DMI_MATCH(DMI_SYS_VENDOR, ""), | ||
354 | DMI_MATCH(DMI_PRODUCT_NAME, "") | ||
355 | }, | ||
356 | .driver_data = keymap_Lifebook_Tseries | ||
357 | }, | ||
358 | { NULL } | ||
359 | }; | ||
360 | |||
361 | static acpi_status __devinit | ||
362 | fujitsu_walk_resources(struct acpi_resource *res, void *data) | ||
363 | { | ||
364 | switch (res->type) { | ||
365 | case ACPI_RESOURCE_TYPE_IRQ: | ||
366 | fujitsu.irq = res->data.irq.interrupts[0]; | ||
367 | return AE_OK; | ||
368 | |||
369 | case ACPI_RESOURCE_TYPE_IO: | ||
370 | fujitsu.io_base = res->data.io.minimum; | ||
371 | fujitsu.io_length = res->data.io.address_length; | ||
372 | return AE_OK; | ||
373 | |||
374 | case ACPI_RESOURCE_TYPE_END_TAG: | ||
375 | if (fujitsu.irq && fujitsu.io_base) | ||
376 | return AE_OK; | ||
377 | else | ||
378 | return AE_NOT_FOUND; | ||
379 | |||
380 | default: | ||
381 | return AE_ERROR; | ||
382 | } | ||
383 | } | ||
384 | |||
385 | static int __devinit acpi_fujitsu_add(struct acpi_device *adev) | ||
386 | { | ||
387 | acpi_status status; | ||
388 | int error; | ||
389 | |||
390 | if (!adev) | ||
391 | return -EINVAL; | ||
392 | |||
393 | status = acpi_walk_resources(adev->handle, METHOD_NAME__CRS, | ||
394 | fujitsu_walk_resources, NULL); | ||
395 | if (ACPI_FAILURE(status) || !fujitsu.irq || !fujitsu.io_base) | ||
396 | return -ENODEV; | ||
397 | |||
398 | sprintf(acpi_device_name(adev), "Fujitsu %s", acpi_device_hid(adev)); | ||
399 | sprintf(acpi_device_class(adev), "%s", ACPI_FUJITSU_CLASS); | ||
400 | |||
401 | snprintf(fujitsu.phys, sizeof(fujitsu.phys), | ||
402 | "%s/input0", acpi_device_hid(adev)); | ||
403 | |||
404 | error = input_fujitsu_setup(&adev->dev, | ||
405 | acpi_device_name(adev), fujitsu.phys); | ||
406 | if (error) | ||
407 | return error; | ||
408 | |||
409 | if (!request_region(fujitsu.io_base, fujitsu.io_length, MODULENAME)) { | ||
410 | input_fujitsu_remove(); | ||
411 | return -EBUSY; | ||
412 | } | ||
413 | |||
414 | fujitsu_reset(); | ||
415 | |||
416 | error = request_irq(fujitsu.irq, fujitsu_interrupt, | ||
417 | IRQF_SHARED, MODULENAME, fujitsu_interrupt); | ||
418 | if (error) { | ||
419 | release_region(fujitsu.io_base, fujitsu.io_length); | ||
420 | input_fujitsu_remove(); | ||
421 | return error; | ||
422 | } | ||
423 | |||
424 | return 0; | ||
425 | } | ||
426 | |||
427 | static int __devexit acpi_fujitsu_remove(struct acpi_device *adev, int type) | ||
428 | { | ||
429 | free_irq(fujitsu.irq, fujitsu_interrupt); | ||
430 | release_region(fujitsu.io_base, fujitsu.io_length); | ||
431 | input_fujitsu_remove(); | ||
432 | return 0; | ||
433 | } | ||
434 | |||
435 | static int acpi_fujitsu_resume(struct acpi_device *adev) | ||
436 | { | ||
437 | fujitsu_reset(); | ||
438 | return 0; | ||
439 | } | ||
440 | |||
441 | static struct acpi_driver acpi_fujitsu_driver = { | ||
442 | .name = MODULENAME, | ||
443 | .class = "hotkey", | ||
444 | .ids = fujitsu_ids, | ||
445 | .ops = { | ||
446 | .add = acpi_fujitsu_add, | ||
447 | .remove = acpi_fujitsu_remove, | ||
448 | .resume = acpi_fujitsu_resume, | ||
449 | } | ||
450 | }; | ||
451 | |||
452 | static int __init fujitsu_module_init(void) | ||
453 | { | ||
454 | int error; | ||
455 | |||
456 | dmi_check_system(dmi_ids); | ||
457 | |||
458 | error = acpi_bus_register_driver(&acpi_fujitsu_driver); | ||
459 | if (error) | ||
460 | return error; | ||
461 | |||
462 | return 0; | ||
463 | } | ||
464 | |||
465 | static void __exit fujitsu_module_exit(void) | ||
466 | { | ||
467 | acpi_bus_unregister_driver(&acpi_fujitsu_driver); | ||
468 | } | ||
469 | |||
470 | module_init(fujitsu_module_init); | ||
471 | module_exit(fujitsu_module_exit); | ||
472 | |||
473 | MODULE_AUTHOR("Robert Gerlach <khnz@gmx.de>"); | ||
474 | MODULE_DESCRIPTION("Fujitsu tablet pc extras driver"); | ||
475 | MODULE_LICENSE("GPL"); | ||
476 | MODULE_VERSION("2.4"); | ||
477 | |||
478 | MODULE_DEVICE_TABLE(acpi, fujitsu_ids); | ||
diff --git a/drivers/platform/x86/panasonic-laptop.c b/drivers/platform/x86/panasonic-laptop.c index 05be30ee158..ffff8b4b494 100644 --- a/drivers/platform/x86/panasonic-laptop.c +++ b/drivers/platform/x86/panasonic-laptop.c | |||
@@ -562,8 +562,8 @@ static int acpi_pcc_hotkey_add(struct acpi_device *device) | |||
562 | 562 | ||
563 | num_sifr = acpi_pcc_get_sqty(device); | 563 | num_sifr = acpi_pcc_get_sqty(device); |
564 | 564 | ||
565 | if (num_sifr > 255) { | 565 | if (num_sifr < 0 || num_sifr > 255) { |
566 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "num_sifr too large")); | 566 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "num_sifr out of range")); |
567 | return -ENODEV; | 567 | return -ENODEV; |
568 | } | 568 | } |
569 | 569 | ||
diff --git a/drivers/rapidio/devices/tsi721.h b/drivers/rapidio/devices/tsi721.h index 822e54c394d..1c226b31af1 100644 --- a/drivers/rapidio/devices/tsi721.h +++ b/drivers/rapidio/devices/tsi721.h | |||
@@ -118,34 +118,34 @@ | |||
118 | 118 | ||
119 | #define TSI721_IDB_ENTRY_SIZE 64 | 119 | #define TSI721_IDB_ENTRY_SIZE 64 |
120 | 120 | ||
121 | #define TSI721_IDQ_CTL(x) (0x20000 + (x) * 1000) | 121 | #define TSI721_IDQ_CTL(x) (0x20000 + (x) * 0x1000) |
122 | #define TSI721_IDQ_SUSPEND 0x00000002 | 122 | #define TSI721_IDQ_SUSPEND 0x00000002 |
123 | #define TSI721_IDQ_INIT 0x00000001 | 123 | #define TSI721_IDQ_INIT 0x00000001 |
124 | 124 | ||
125 | #define TSI721_IDQ_STS(x) (0x20004 + (x) * 1000) | 125 | #define TSI721_IDQ_STS(x) (0x20004 + (x) * 0x1000) |
126 | #define TSI721_IDQ_RUN 0x00200000 | 126 | #define TSI721_IDQ_RUN 0x00200000 |
127 | 127 | ||
128 | #define TSI721_IDQ_MASK(x) (0x20008 + (x) * 1000) | 128 | #define TSI721_IDQ_MASK(x) (0x20008 + (x) * 0x1000) |
129 | #define TSI721_IDQ_MASK_MASK 0xffff0000 | 129 | #define TSI721_IDQ_MASK_MASK 0xffff0000 |
130 | #define TSI721_IDQ_MASK_PATT 0x0000ffff | 130 | #define TSI721_IDQ_MASK_PATT 0x0000ffff |
131 | 131 | ||
132 | #define TSI721_IDQ_RP(x) (0x2000c + (x) * 1000) | 132 | #define TSI721_IDQ_RP(x) (0x2000c + (x) * 0x1000) |
133 | #define TSI721_IDQ_RP_PTR 0x0007ffff | 133 | #define TSI721_IDQ_RP_PTR 0x0007ffff |
134 | 134 | ||
135 | #define TSI721_IDQ_WP(x) (0x20010 + (x) * 1000) | 135 | #define TSI721_IDQ_WP(x) (0x20010 + (x) * 0x1000) |
136 | #define TSI721_IDQ_WP_PTR 0x0007ffff | 136 | #define TSI721_IDQ_WP_PTR 0x0007ffff |
137 | 137 | ||
138 | #define TSI721_IDQ_BASEL(x) (0x20014 + (x) * 1000) | 138 | #define TSI721_IDQ_BASEL(x) (0x20014 + (x) * 0x1000) |
139 | #define TSI721_IDQ_BASEL_ADDR 0xffffffc0 | 139 | #define TSI721_IDQ_BASEL_ADDR 0xffffffc0 |
140 | #define TSI721_IDQ_BASEU(x) (0x20018 + (x) * 1000) | 140 | #define TSI721_IDQ_BASEU(x) (0x20018 + (x) * 0x1000) |
141 | #define TSI721_IDQ_SIZE(x) (0x2001c + (x) * 1000) | 141 | #define TSI721_IDQ_SIZE(x) (0x2001c + (x) * 0x1000) |
142 | #define TSI721_IDQ_SIZE_VAL(size) (__fls(size) - 4) | 142 | #define TSI721_IDQ_SIZE_VAL(size) (__fls(size) - 4) |
143 | #define TSI721_IDQ_SIZE_MIN 512 | 143 | #define TSI721_IDQ_SIZE_MIN 512 |
144 | #define TSI721_IDQ_SIZE_MAX (512 * 1024) | 144 | #define TSI721_IDQ_SIZE_MAX (512 * 1024) |
145 | 145 | ||
146 | #define TSI721_SR_CHINT(x) (0x20040 + (x) * 1000) | 146 | #define TSI721_SR_CHINT(x) (0x20040 + (x) * 0x1000) |
147 | #define TSI721_SR_CHINTE(x) (0x20044 + (x) * 1000) | 147 | #define TSI721_SR_CHINTE(x) (0x20044 + (x) * 0x1000) |
148 | #define TSI721_SR_CHINTSET(x) (0x20048 + (x) * 1000) | 148 | #define TSI721_SR_CHINTSET(x) (0x20048 + (x) * 0x1000) |
149 | #define TSI721_SR_CHINT_ODBOK 0x00000020 | 149 | #define TSI721_SR_CHINT_ODBOK 0x00000020 |
150 | #define TSI721_SR_CHINT_IDBQRCV 0x00000010 | 150 | #define TSI721_SR_CHINT_IDBQRCV 0x00000010 |
151 | #define TSI721_SR_CHINT_SUSP 0x00000008 | 151 | #define TSI721_SR_CHINT_SUSP 0x00000008 |
@@ -156,7 +156,7 @@ | |||
156 | 156 | ||
157 | #define TSI721_IBWIN_NUM 8 | 157 | #define TSI721_IBWIN_NUM 8 |
158 | 158 | ||
159 | #define TSI721_IBWINLB(x) (0x29000 + (x) * 20) | 159 | #define TSI721_IBWINLB(x) (0x29000 + (x) * 0x20) |
160 | #define TSI721_IBWINLB_BA 0xfffff000 | 160 | #define TSI721_IBWINLB_BA 0xfffff000 |
161 | #define TSI721_IBWINLB_WEN 0x00000001 | 161 | #define TSI721_IBWINLB_WEN 0x00000001 |
162 | 162 | ||
@@ -187,13 +187,13 @@ | |||
187 | */ | 187 | */ |
188 | #define TSI721_OBWIN_NUM TSI721_PC2SR_WINS | 188 | #define TSI721_OBWIN_NUM TSI721_PC2SR_WINS |
189 | 189 | ||
190 | #define TSI721_OBWINLB(x) (0x40000 + (x) * 20) | 190 | #define TSI721_OBWINLB(x) (0x40000 + (x) * 0x20) |
191 | #define TSI721_OBWINLB_BA 0xffff8000 | 191 | #define TSI721_OBWINLB_BA 0xffff8000 |
192 | #define TSI721_OBWINLB_WEN 0x00000001 | 192 | #define TSI721_OBWINLB_WEN 0x00000001 |
193 | 193 | ||
194 | #define TSI721_OBWINUB(x) (0x40004 + (x) * 20) | 194 | #define TSI721_OBWINUB(x) (0x40004 + (x) * 0x20) |
195 | 195 | ||
196 | #define TSI721_OBWINSZ(x) (0x40008 + (x) * 20) | 196 | #define TSI721_OBWINSZ(x) (0x40008 + (x) * 0x20) |
197 | #define TSI721_OBWINSZ_SIZE 0x00001f00 | 197 | #define TSI721_OBWINSZ_SIZE 0x00001f00 |
198 | #define TSI721_OBWIN_SIZE(size) (__fls(size) - 15) | 198 | #define TSI721_OBWIN_SIZE(size) (__fls(size) - 15) |
199 | 199 | ||
diff --git a/drivers/regulator/da9052-regulator.c b/drivers/regulator/da9052-regulator.c index ea4d8f575ac..09915e89705 100644 --- a/drivers/regulator/da9052-regulator.c +++ b/drivers/regulator/da9052-regulator.c | |||
@@ -226,7 +226,7 @@ static int da9052_regulator_set_voltage_int(struct regulator_dev *rdev, | |||
226 | if (min_uV < info->min_uV) | 226 | if (min_uV < info->min_uV) |
227 | min_uV = info->min_uV; | 227 | min_uV = info->min_uV; |
228 | 228 | ||
229 | *selector = (min_uV - info->min_uV) / info->step_uV; | 229 | *selector = DIV_ROUND_UP(min_uV - info->min_uV, info->step_uV); |
230 | 230 | ||
231 | ret = da9052_list_voltage(rdev, *selector); | 231 | ret = da9052_list_voltage(rdev, *selector); |
232 | if (ret < 0) | 232 | if (ret < 0) |
@@ -318,10 +318,10 @@ static int da9052_set_buckperi_voltage(struct regulator_dev *rdev, int min_uV, | |||
318 | if ((regulator->da9052->chip_id == DA9052) && | 318 | if ((regulator->da9052->chip_id == DA9052) && |
319 | (min_uV >= DA9052_CONST_3uV)) | 319 | (min_uV >= DA9052_CONST_3uV)) |
320 | *selector = DA9052_BUCK_PERI_REG_MAP_UPTO_3uV + | 320 | *selector = DA9052_BUCK_PERI_REG_MAP_UPTO_3uV + |
321 | ((min_uV - DA9052_CONST_3uV) / | 321 | DIV_ROUND_UP(min_uV - DA9052_CONST_3uV, |
322 | (DA9052_BUCK_PERI_3uV_STEP)); | 322 | DA9052_BUCK_PERI_3uV_STEP); |
323 | else | 323 | else |
324 | *selector = (min_uV - info->min_uV) / info->step_uV; | 324 | *selector = DIV_ROUND_UP(min_uV - info->min_uV, info->step_uV); |
325 | 325 | ||
326 | ret = da9052_list_buckperi_voltage(rdev, *selector); | 326 | ret = da9052_list_buckperi_voltage(rdev, *selector); |
327 | if (ret < 0) | 327 | if (ret < 0) |
@@ -400,6 +400,7 @@ static struct regulator_ops da9052_ldo_ops = { | |||
400 | .ops = &da9052_ldo5_6_ops,\ | 400 | .ops = &da9052_ldo5_6_ops,\ |
401 | .type = REGULATOR_VOLTAGE,\ | 401 | .type = REGULATOR_VOLTAGE,\ |
402 | .id = _id,\ | 402 | .id = _id,\ |
403 | .n_voltages = (max - min) / step + 1, \ | ||
403 | .owner = THIS_MODULE,\ | 404 | .owner = THIS_MODULE,\ |
404 | },\ | 405 | },\ |
405 | .min_uV = (min) * 1000,\ | 406 | .min_uV = (min) * 1000,\ |
@@ -417,6 +418,7 @@ static struct regulator_ops da9052_ldo_ops = { | |||
417 | .ops = &da9052_ldo_ops,\ | 418 | .ops = &da9052_ldo_ops,\ |
418 | .type = REGULATOR_VOLTAGE,\ | 419 | .type = REGULATOR_VOLTAGE,\ |
419 | .id = _id,\ | 420 | .id = _id,\ |
421 | .n_voltages = (max - min) / step + 1, \ | ||
420 | .owner = THIS_MODULE,\ | 422 | .owner = THIS_MODULE,\ |
421 | },\ | 423 | },\ |
422 | .min_uV = (min) * 1000,\ | 424 | .min_uV = (min) * 1000,\ |
@@ -434,6 +436,7 @@ static struct regulator_ops da9052_ldo_ops = { | |||
434 | .ops = &da9052_dcdc_ops,\ | 436 | .ops = &da9052_dcdc_ops,\ |
435 | .type = REGULATOR_VOLTAGE,\ | 437 | .type = REGULATOR_VOLTAGE,\ |
436 | .id = _id,\ | 438 | .id = _id,\ |
439 | .n_voltages = (max - min) / step + 1, \ | ||
437 | .owner = THIS_MODULE,\ | 440 | .owner = THIS_MODULE,\ |
438 | },\ | 441 | },\ |
439 | .min_uV = (min) * 1000,\ | 442 | .min_uV = (min) * 1000,\ |
@@ -451,6 +454,7 @@ static struct regulator_ops da9052_ldo_ops = { | |||
451 | .ops = &da9052_buckperi_ops,\ | 454 | .ops = &da9052_buckperi_ops,\ |
452 | .type = REGULATOR_VOLTAGE,\ | 455 | .type = REGULATOR_VOLTAGE,\ |
453 | .id = _id,\ | 456 | .id = _id,\ |
457 | .n_voltages = (max - min) / step + 1, \ | ||
454 | .owner = THIS_MODULE,\ | 458 | .owner = THIS_MODULE,\ |
455 | },\ | 459 | },\ |
456 | .min_uV = (min) * 1000,\ | 460 | .min_uV = (min) * 1000,\ |
diff --git a/drivers/regulator/tps6524x-regulator.c b/drivers/regulator/tps6524x-regulator.c index 70b7b1f4f00..2e94686b6fe 100644 --- a/drivers/regulator/tps6524x-regulator.c +++ b/drivers/regulator/tps6524x-regulator.c | |||
@@ -481,7 +481,7 @@ static int set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV, | |||
481 | if (i >= info->n_voltages) | 481 | if (i >= info->n_voltages) |
482 | i = info->n_voltages - 1; | 482 | i = info->n_voltages - 1; |
483 | 483 | ||
484 | *selector = info->voltages[i]; | 484 | *selector = i; |
485 | 485 | ||
486 | return write_field(hw, &info->voltage, i); | 486 | return write_field(hw, &info->voltage, i); |
487 | } | 487 | } |
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index 44262908def..501b27c1814 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c | |||
@@ -1028,7 +1028,7 @@ done: | |||
1028 | return iscsit_add_reject_from_cmd( | 1028 | return iscsit_add_reject_from_cmd( |
1029 | ISCSI_REASON_BOOKMARK_NO_RESOURCES, | 1029 | ISCSI_REASON_BOOKMARK_NO_RESOURCES, |
1030 | 1, 1, buf, cmd); | 1030 | 1, 1, buf, cmd); |
1031 | } else if (transport_ret == -EINVAL) { | 1031 | } else if (transport_ret < 0) { |
1032 | /* | 1032 | /* |
1033 | * Unsupported SAM Opcode. CHECK_CONDITION will be sent | 1033 | * Unsupported SAM Opcode. CHECK_CONDITION will be sent |
1034 | * in iscsit_execute_cmd() during the CmdSN OOO Execution | 1034 | * in iscsit_execute_cmd() during the CmdSN OOO Execution |
diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c index b7c779389ee..63e703bb6ac 100644 --- a/drivers/target/target_core_pr.c +++ b/drivers/target/target_core_pr.c | |||
@@ -117,7 +117,7 @@ static struct t10_pr_registration *core_scsi3_locate_pr_reg(struct se_device *, | |||
117 | struct se_node_acl *, struct se_session *); | 117 | struct se_node_acl *, struct se_session *); |
118 | static void core_scsi3_put_pr_reg(struct t10_pr_registration *); | 118 | static void core_scsi3_put_pr_reg(struct t10_pr_registration *); |
119 | 119 | ||
120 | static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd, int *ret) | 120 | static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd) |
121 | { | 121 | { |
122 | struct se_session *se_sess = cmd->se_sess; | 122 | struct se_session *se_sess = cmd->se_sess; |
123 | struct se_subsystem_dev *su_dev = cmd->se_dev->se_sub_dev; | 123 | struct se_subsystem_dev *su_dev = cmd->se_dev->se_sub_dev; |
@@ -127,7 +127,7 @@ static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd, int *ret) | |||
127 | int conflict = 0; | 127 | int conflict = 0; |
128 | 128 | ||
129 | if (!crh) | 129 | if (!crh) |
130 | return false; | 130 | return -EINVAL; |
131 | 131 | ||
132 | pr_reg = core_scsi3_locate_pr_reg(cmd->se_dev, se_sess->se_node_acl, | 132 | pr_reg = core_scsi3_locate_pr_reg(cmd->se_dev, se_sess->se_node_acl, |
133 | se_sess); | 133 | se_sess); |
@@ -155,16 +155,14 @@ static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd, int *ret) | |||
155 | */ | 155 | */ |
156 | if (pr_reg->pr_res_holder) { | 156 | if (pr_reg->pr_res_holder) { |
157 | core_scsi3_put_pr_reg(pr_reg); | 157 | core_scsi3_put_pr_reg(pr_reg); |
158 | *ret = 0; | 158 | return 1; |
159 | return false; | ||
160 | } | 159 | } |
161 | if ((pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_REGONLY) || | 160 | if ((pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_REGONLY) || |
162 | (pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_REGONLY) || | 161 | (pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_REGONLY) || |
163 | (pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_ALLREG) || | 162 | (pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_ALLREG) || |
164 | (pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_ALLREG)) { | 163 | (pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_ALLREG)) { |
165 | core_scsi3_put_pr_reg(pr_reg); | 164 | core_scsi3_put_pr_reg(pr_reg); |
166 | *ret = 0; | 165 | return 1; |
167 | return true; | ||
168 | } | 166 | } |
169 | core_scsi3_put_pr_reg(pr_reg); | 167 | core_scsi3_put_pr_reg(pr_reg); |
170 | conflict = 1; | 168 | conflict = 1; |
@@ -189,10 +187,10 @@ static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd, int *ret) | |||
189 | " while active SPC-3 registrations exist," | 187 | " while active SPC-3 registrations exist," |
190 | " returning RESERVATION_CONFLICT\n"); | 188 | " returning RESERVATION_CONFLICT\n"); |
191 | cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT; | 189 | cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT; |
192 | return true; | 190 | return -EBUSY; |
193 | } | 191 | } |
194 | 192 | ||
195 | return false; | 193 | return 0; |
196 | } | 194 | } |
197 | 195 | ||
198 | int target_scsi2_reservation_release(struct se_task *task) | 196 | int target_scsi2_reservation_release(struct se_task *task) |
@@ -201,12 +199,18 @@ int target_scsi2_reservation_release(struct se_task *task) | |||
201 | struct se_device *dev = cmd->se_dev; | 199 | struct se_device *dev = cmd->se_dev; |
202 | struct se_session *sess = cmd->se_sess; | 200 | struct se_session *sess = cmd->se_sess; |
203 | struct se_portal_group *tpg = sess->se_tpg; | 201 | struct se_portal_group *tpg = sess->se_tpg; |
204 | int ret = 0; | 202 | int ret = 0, rc; |
205 | 203 | ||
206 | if (!sess || !tpg) | 204 | if (!sess || !tpg) |
207 | goto out; | 205 | goto out; |
208 | if (target_check_scsi2_reservation_conflict(cmd, &ret)) | 206 | rc = target_check_scsi2_reservation_conflict(cmd); |
207 | if (rc == 1) | ||
208 | goto out; | ||
209 | else if (rc < 0) { | ||
210 | cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT; | ||
211 | ret = -EINVAL; | ||
209 | goto out; | 212 | goto out; |
213 | } | ||
210 | 214 | ||
211 | ret = 0; | 215 | ret = 0; |
212 | spin_lock(&dev->dev_reservation_lock); | 216 | spin_lock(&dev->dev_reservation_lock); |
@@ -243,7 +247,7 @@ int target_scsi2_reservation_reserve(struct se_task *task) | |||
243 | struct se_device *dev = cmd->se_dev; | 247 | struct se_device *dev = cmd->se_dev; |
244 | struct se_session *sess = cmd->se_sess; | 248 | struct se_session *sess = cmd->se_sess; |
245 | struct se_portal_group *tpg = sess->se_tpg; | 249 | struct se_portal_group *tpg = sess->se_tpg; |
246 | int ret = 0; | 250 | int ret = 0, rc; |
247 | 251 | ||
248 | if ((cmd->t_task_cdb[1] & 0x01) && | 252 | if ((cmd->t_task_cdb[1] & 0x01) && |
249 | (cmd->t_task_cdb[1] & 0x02)) { | 253 | (cmd->t_task_cdb[1] & 0x02)) { |
@@ -259,8 +263,14 @@ int target_scsi2_reservation_reserve(struct se_task *task) | |||
259 | */ | 263 | */ |
260 | if (!sess || !tpg) | 264 | if (!sess || !tpg) |
261 | goto out; | 265 | goto out; |
262 | if (target_check_scsi2_reservation_conflict(cmd, &ret)) | 266 | rc = target_check_scsi2_reservation_conflict(cmd); |
267 | if (rc == 1) | ||
263 | goto out; | 268 | goto out; |
269 | else if (rc < 0) { | ||
270 | cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT; | ||
271 | ret = -EINVAL; | ||
272 | goto out; | ||
273 | } | ||
264 | 274 | ||
265 | ret = 0; | 275 | ret = 0; |
266 | spin_lock(&dev->dev_reservation_lock); | 276 | spin_lock(&dev->dev_reservation_lock); |
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 58cea07b12f..cd5cd95812b 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c | |||
@@ -2539,6 +2539,7 @@ static int transport_generic_cmd_sequencer( | |||
2539 | cmd, cdb, pr_reg_type) != 0) { | 2539 | cmd, cdb, pr_reg_type) != 0) { |
2540 | cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION; | 2540 | cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION; |
2541 | cmd->se_cmd_flags |= SCF_SCSI_RESERVATION_CONFLICT; | 2541 | cmd->se_cmd_flags |= SCF_SCSI_RESERVATION_CONFLICT; |
2542 | cmd->scsi_status = SAM_STAT_RESERVATION_CONFLICT; | ||
2542 | cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT; | 2543 | cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT; |
2543 | return -EBUSY; | 2544 | return -EBUSY; |
2544 | } | 2545 | } |
diff --git a/drivers/target/tcm_fc/tfc_sess.c b/drivers/target/tcm_fc/tfc_sess.c index 4c0507cf808..eff512b5a2a 100644 --- a/drivers/target/tcm_fc/tfc_sess.c +++ b/drivers/target/tcm_fc/tfc_sess.c | |||
@@ -86,16 +86,6 @@ static struct ft_tport *ft_tport_create(struct fc_lport *lport) | |||
86 | } | 86 | } |
87 | 87 | ||
88 | /* | 88 | /* |
89 | * Free tport via RCU. | ||
90 | */ | ||
91 | static void ft_tport_rcu_free(struct rcu_head *rcu) | ||
92 | { | ||
93 | struct ft_tport *tport = container_of(rcu, struct ft_tport, rcu); | ||
94 | |||
95 | kfree(tport); | ||
96 | } | ||
97 | |||
98 | /* | ||
99 | * Delete a target local port. | 89 | * Delete a target local port. |
100 | * Caller holds ft_lport_lock. | 90 | * Caller holds ft_lport_lock. |
101 | */ | 91 | */ |
@@ -114,7 +104,7 @@ static void ft_tport_delete(struct ft_tport *tport) | |||
114 | tpg->tport = NULL; | 104 | tpg->tport = NULL; |
115 | tport->tpg = NULL; | 105 | tport->tpg = NULL; |
116 | } | 106 | } |
117 | call_rcu(&tport->rcu, ft_tport_rcu_free); | 107 | kfree_rcu(tport, rcu); |
118 | } | 108 | } |
119 | 109 | ||
120 | /* | 110 | /* |
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index 75085795528..61b7fd2729c 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c | |||
@@ -1710,6 +1710,8 @@ static int sci_startup(struct uart_port *port) | |||
1710 | 1710 | ||
1711 | dev_dbg(port->dev, "%s(%d)\n", __func__, port->line); | 1711 | dev_dbg(port->dev, "%s(%d)\n", __func__, port->line); |
1712 | 1712 | ||
1713 | pm_runtime_put_noidle(port->dev); | ||
1714 | |||
1713 | sci_port_enable(s); | 1715 | sci_port_enable(s); |
1714 | 1716 | ||
1715 | ret = sci_request_irq(s); | 1717 | ret = sci_request_irq(s); |
@@ -1737,6 +1739,8 @@ static void sci_shutdown(struct uart_port *port) | |||
1737 | sci_free_irq(s); | 1739 | sci_free_irq(s); |
1738 | 1740 | ||
1739 | sci_port_disable(s); | 1741 | sci_port_disable(s); |
1742 | |||
1743 | pm_runtime_get_noresume(port->dev); | ||
1740 | } | 1744 | } |
1741 | 1745 | ||
1742 | static unsigned int sci_scbrr_calc(unsigned int algo_id, unsigned int bps, | 1746 | static unsigned int sci_scbrr_calc(unsigned int algo_id, unsigned int bps, |
@@ -2075,6 +2079,7 @@ static int __devinit sci_init_single(struct platform_device *dev, | |||
2075 | sci_init_gpios(sci_port); | 2079 | sci_init_gpios(sci_port); |
2076 | 2080 | ||
2077 | pm_runtime_irq_safe(&dev->dev); | 2081 | pm_runtime_irq_safe(&dev->dev); |
2082 | pm_runtime_get_noresume(&dev->dev); | ||
2078 | pm_runtime_enable(&dev->dev); | 2083 | pm_runtime_enable(&dev->dev); |
2079 | } | 2084 | } |
2080 | 2085 | ||
diff --git a/drivers/video/backlight/s6e63m0.c b/drivers/video/backlight/s6e63m0.c index e132157d854..516db703dd2 100644 --- a/drivers/video/backlight/s6e63m0.c +++ b/drivers/video/backlight/s6e63m0.c | |||
@@ -690,7 +690,7 @@ static ssize_t s6e63m0_sysfs_store_gamma_mode(struct device *dev, | |||
690 | struct backlight_device *bd = NULL; | 690 | struct backlight_device *bd = NULL; |
691 | int brightness, rc; | 691 | int brightness, rc; |
692 | 692 | ||
693 | rc = strict_strtoul(buf, 0, (unsigned long *)&lcd->gamma_mode); | 693 | rc = kstrtouint(buf, 0, &lcd->gamma_mode); |
694 | if (rc < 0) | 694 | if (rc < 0) |
695 | return rc; | 695 | return rc; |
696 | 696 | ||