diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/ata/sata_mv.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index 6ebebde8454a..83584b6e1ba5 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c | |||
@@ -74,6 +74,7 @@ | |||
74 | #include <linux/device.h> | 74 | #include <linux/device.h> |
75 | #include <linux/platform_device.h> | 75 | #include <linux/platform_device.h> |
76 | #include <linux/ata_platform.h> | 76 | #include <linux/ata_platform.h> |
77 | #include <linux/mbus.h> | ||
77 | #include <scsi/scsi_host.h> | 78 | #include <scsi/scsi_host.h> |
78 | #include <scsi/scsi_cmnd.h> | 79 | #include <scsi/scsi_cmnd.h> |
79 | #include <scsi/scsi_device.h> | 80 | #include <scsi/scsi_device.h> |
@@ -352,6 +353,9 @@ enum { | |||
352 | #define IS_GEN_IIE(hpriv) ((hpriv)->hp_flags & MV_HP_GEN_IIE) | 353 | #define IS_GEN_IIE(hpriv) ((hpriv)->hp_flags & MV_HP_GEN_IIE) |
353 | #define HAS_PCI(host) (!((host)->ports[0]->flags & MV_FLAG_SOC)) | 354 | #define HAS_PCI(host) (!((host)->ports[0]->flags & MV_FLAG_SOC)) |
354 | 355 | ||
356 | #define WINDOW_CTRL(i) (0x20030 + ((i) << 4)) | ||
357 | #define WINDOW_BASE(i) (0x20034 + ((i) << 4)) | ||
358 | |||
355 | enum { | 359 | enum { |
356 | /* DMA boundary 0xffff is required by the s/g splitting | 360 | /* DMA boundary 0xffff is required by the s/g splitting |
357 | * we need on /length/ in mv_fill-sg(). | 361 | * we need on /length/ in mv_fill-sg(). |
@@ -2897,6 +2901,27 @@ static int mv_create_dma_pools(struct mv_host_priv *hpriv, struct device *dev) | |||
2897 | return 0; | 2901 | return 0; |
2898 | } | 2902 | } |
2899 | 2903 | ||
2904 | static void mv_conf_mbus_windows(struct mv_host_priv *hpriv, | ||
2905 | struct mbus_dram_target_info *dram) | ||
2906 | { | ||
2907 | int i; | ||
2908 | |||
2909 | for (i = 0; i < 4; i++) { | ||
2910 | writel(0, hpriv->base + WINDOW_CTRL(i)); | ||
2911 | writel(0, hpriv->base + WINDOW_BASE(i)); | ||
2912 | } | ||
2913 | |||
2914 | for (i = 0; i < dram->num_cs; i++) { | ||
2915 | struct mbus_dram_window *cs = dram->cs + i; | ||
2916 | |||
2917 | writel(((cs->size - 1) & 0xffff0000) | | ||
2918 | (cs->mbus_attr << 8) | | ||
2919 | (dram->mbus_dram_target_id << 4) | 1, | ||
2920 | hpriv->base + WINDOW_CTRL(i)); | ||
2921 | writel(cs->base, hpriv->base + WINDOW_BASE(i)); | ||
2922 | } | ||
2923 | } | ||
2924 | |||
2900 | /** | 2925 | /** |
2901 | * mv_platform_probe - handle a positive probe of an soc Marvell | 2926 | * mv_platform_probe - handle a positive probe of an soc Marvell |
2902 | * host | 2927 | * host |
@@ -2951,6 +2976,12 @@ static int mv_platform_probe(struct platform_device *pdev) | |||
2951 | res->end - res->start + 1); | 2976 | res->end - res->start + 1); |
2952 | hpriv->base -= MV_SATAHC0_REG_BASE; | 2977 | hpriv->base -= MV_SATAHC0_REG_BASE; |
2953 | 2978 | ||
2979 | /* | ||
2980 | * (Re-)program MBUS remapping windows if we are asked to. | ||
2981 | */ | ||
2982 | if (mv_platform_data->dram != NULL) | ||
2983 | mv_conf_mbus_windows(hpriv, mv_platform_data->dram); | ||
2984 | |||
2954 | rc = mv_create_dma_pools(hpriv, &pdev->dev); | 2985 | rc = mv_create_dma_pools(hpriv, &pdev->dev); |
2955 | if (rc) | 2986 | if (rc) |
2956 | return rc; | 2987 | return rc; |