diff options
Diffstat (limited to 'drivers/media/video/stradis.c')
-rw-r--r-- | drivers/media/video/stradis.c | 170 |
1 files changed, 68 insertions, 102 deletions
diff --git a/drivers/media/video/stradis.c b/drivers/media/video/stradis.c index ad6646c7da03..48cd30d8eb5a 100644 --- a/drivers/media/video/stradis.c +++ b/drivers/media/video/stradis.c | |||
@@ -309,41 +309,6 @@ static u32 debiread(struct saa7146 *saa, u32 config, int addr, int count) | |||
309 | return result; | 309 | return result; |
310 | } | 310 | } |
311 | 311 | ||
312 | #if 0 /* unused */ | ||
313 | /* MUST be a multiple of 8 bytes and 8-byte aligned and < 32768 bytes */ | ||
314 | /* data copied into saa->dmadebi buffer, caller must re-enable interrupts */ | ||
315 | static void ibm_block_dram_read(struct saa7146 *saa, int address, int bytes) | ||
316 | { | ||
317 | int i, j; | ||
318 | u32 *buf; | ||
319 | buf = (u32 *) saa->dmadebi; | ||
320 | if (bytes > 0x7000) | ||
321 | bytes = 0x7000; | ||
322 | saawrite(0, SAA7146_IER); /* disable interrupts */ | ||
323 | for (i=0; i < 10000 && | ||
324 | (debiread(saa, debNormal, IBM_MP2_DRAM_CMD_STAT, 2) | ||
325 | & 0x8000); i++) | ||
326 | saaread(SAA7146_MC2); | ||
327 | if (i == 10000) | ||
328 | printk(KERN_ERR "stradis%d: dram_busy never cleared\n", | ||
329 | saa->nr); | ||
330 | debiwrite(saa, debNormal, IBM_MP2_SRC_ADDR, (address<<16) | | ||
331 | (address>>16), 4); | ||
332 | debiwrite(saa, debNormal, IBM_MP2_BLOCK_SIZE, bytes, 2); | ||
333 | debiwrite(saa, debNormal, IBM_MP2_CMD_STAT, 0x8a10, 2); | ||
334 | for (j = 0; j < bytes/4; j++) { | ||
335 | for (i = 0; i < 10000 && | ||
336 | (!(debiread(saa, debNormal, IBM_MP2_DRAM_CMD_STAT, 2) | ||
337 | & 0x4000)); i++) | ||
338 | saaread(SAA7146_MC2); | ||
339 | if (i == 10000) | ||
340 | printk(KERN_ERR "stradis%d: dram_ready never set\n", | ||
341 | saa->nr); | ||
342 | buf[j] = debiread(saa, debNormal, IBM_MP2_DRAM_DATA, 4); | ||
343 | } | ||
344 | } | ||
345 | #endif /* unused */ | ||
346 | |||
347 | static void do_irq_send_data(struct saa7146 *saa) | 312 | static void do_irq_send_data(struct saa7146 *saa) |
348 | { | 313 | { |
349 | int split, audbytes, vidbytes; | 314 | int split, audbytes, vidbytes; |
@@ -1935,21 +1900,11 @@ static ssize_t saa_write(struct file *file, const char __user *buf, | |||
1935 | 1900 | ||
1936 | static int saa_open(struct inode *inode, struct file *file) | 1901 | static int saa_open(struct inode *inode, struct file *file) |
1937 | { | 1902 | { |
1938 | struct saa7146 *saa = NULL; | 1903 | struct video_device *vdev = video_devdata(file); |
1939 | unsigned int minor = iminor(inode); | 1904 | struct saa7146 *saa = container_of(vdev, struct saa7146, video_dev); |
1940 | int i; | ||
1941 | 1905 | ||
1942 | for (i = 0; i < SAA7146_MAX; i++) { | ||
1943 | if (saa7146s[i].video_dev.minor == minor) { | ||
1944 | saa = &saa7146s[i]; | ||
1945 | } | ||
1946 | } | ||
1947 | if (saa == NULL) { | ||
1948 | return -ENODEV; | ||
1949 | } | ||
1950 | file->private_data = saa; | 1906 | file->private_data = saa; |
1951 | 1907 | ||
1952 | //saa->video_dev.busy = 0; /* old hack to support multiple open */ | ||
1953 | saa->user++; | 1908 | saa->user++; |
1954 | if (saa->user > 1) | 1909 | if (saa->user > 1) |
1955 | return 0; /* device open already, don't reset */ | 1910 | return 0; /* device open already, don't reset */ |
@@ -1961,7 +1916,7 @@ static int saa_release(struct inode *inode, struct file *file) | |||
1961 | { | 1916 | { |
1962 | struct saa7146 *saa = file->private_data; | 1917 | struct saa7146 *saa = file->private_data; |
1963 | saa->user--; | 1918 | saa->user--; |
1964 | //saa->video_dev.busy = 0; /* old hack to support multiple open */ | 1919 | |
1965 | if (saa->user > 0) /* still someone using device */ | 1920 | if (saa->user > 0) /* still someone using device */ |
1966 | return 0; | 1921 | return 0; |
1967 | saawrite(0x007f0000, SAA7146_MC1); /* stop all overlay dma */ | 1922 | saawrite(0x007f0000, SAA7146_MC1); /* stop all overlay dma */ |
@@ -1993,8 +1948,8 @@ static struct video_device saa_template = | |||
1993 | 1948 | ||
1994 | static int __devinit configure_saa7146(struct pci_dev *pdev, int num) | 1949 | static int __devinit configure_saa7146(struct pci_dev *pdev, int num) |
1995 | { | 1950 | { |
1996 | int result; | 1951 | int retval; |
1997 | struct saa7146 *saa = &saa7146s[num]; | 1952 | struct saa7146 *saa = pci_get_drvdata(pdev); |
1998 | 1953 | ||
1999 | saa->endmarkhead = saa->endmarktail = 0; | 1954 | saa->endmarkhead = saa->endmarktail = 0; |
2000 | saa->win.x = saa->win.y = 0; | 1955 | saa->win.x = saa->win.y = 0; |
@@ -2030,8 +1985,11 @@ static int __devinit configure_saa7146(struct pci_dev *pdev, int num) | |||
2030 | init_waitqueue_head(&saa->vidq); | 1985 | init_waitqueue_head(&saa->vidq); |
2031 | spin_lock_init(&saa->lock); | 1986 | spin_lock_init(&saa->lock); |
2032 | 1987 | ||
2033 | if (pci_enable_device(pdev)) | 1988 | retval = pci_enable_device(pdev); |
2034 | return -EIO; | 1989 | if (retval) { |
1990 | dev_err(&pdev->dev, "%d: pci_enable_device failed!\n", num); | ||
1991 | goto err; | ||
1992 | } | ||
2035 | 1993 | ||
2036 | saa->id = pdev->device; | 1994 | saa->id = pdev->device; |
2037 | saa->irq = pdev->irq; | 1995 | saa->irq = pdev->irq; |
@@ -2040,33 +1998,44 @@ static int __devinit configure_saa7146(struct pci_dev *pdev, int num) | |||
2040 | pci_read_config_byte(pdev, PCI_CLASS_REVISION, &saa->revision); | 1998 | pci_read_config_byte(pdev, PCI_CLASS_REVISION, &saa->revision); |
2041 | 1999 | ||
2042 | saa->saa7146_mem = ioremap(saa->saa7146_adr, 0x200); | 2000 | saa->saa7146_mem = ioremap(saa->saa7146_adr, 0x200); |
2043 | if (!saa->saa7146_mem) | 2001 | if (saa->saa7146_mem == NULL) { |
2044 | return -EIO; | 2002 | dev_err(&pdev->dev, "%d: ioremap failed!\n", num); |
2003 | retval = -EIO; | ||
2004 | goto err; | ||
2005 | } | ||
2045 | 2006 | ||
2046 | memcpy(&saa->video_dev, &saa_template, sizeof(saa_template)); | 2007 | memcpy(&saa->video_dev, &saa_template, sizeof(saa_template)); |
2047 | saawrite(0, SAA7146_IER); /* turn off all interrupts */ | 2008 | saawrite(0, SAA7146_IER); /* turn off all interrupts */ |
2048 | result = request_irq(saa->irq, saa7146_irq, | 2009 | |
2049 | SA_SHIRQ | SA_INTERRUPT, "stradis", (void *) saa); | 2010 | retval = request_irq(saa->irq, saa7146_irq, SA_SHIRQ | SA_INTERRUPT, |
2050 | if (result == -EINVAL) | 2011 | "stradis", saa); |
2012 | if (retval == -EINVAL) | ||
2051 | dev_err(&pdev->dev, "%d: Bad irq number or handler\n", num); | 2013 | dev_err(&pdev->dev, "%d: Bad irq number or handler\n", num); |
2052 | if (result == -EBUSY) | 2014 | else if (retval == -EBUSY) |
2053 | dev_err(&pdev->dev, "%d: IRQ %ld busy, change your PnP config " | 2015 | dev_err(&pdev->dev, "%d: IRQ %ld busy, change your PnP config " |
2054 | "in BIOS\n", num, saa->irq); | 2016 | "in BIOS\n", num, saa->irq); |
2055 | if (result < 0) { | 2017 | if (retval < 0) |
2056 | iounmap(saa->saa7146_mem); | 2018 | goto errio; |
2057 | return result; | 2019 | |
2058 | } | ||
2059 | pci_set_master(pdev); | 2020 | pci_set_master(pdev); |
2060 | if (video_register_device(&saa->video_dev, VFL_TYPE_GRABBER, video_nr) < 0) { | 2021 | retval = video_register_device(&saa->video_dev, VFL_TYPE_GRABBER, |
2061 | iounmap(saa->saa7146_mem); | 2022 | video_nr); |
2062 | return -1; | 2023 | if (retval < 0) { |
2024 | dev_err(&pdev->dev, "%d: error in registering video device!\n", | ||
2025 | num); | ||
2026 | goto errio; | ||
2063 | } | 2027 | } |
2028 | |||
2064 | return 0; | 2029 | return 0; |
2030 | errio: | ||
2031 | iounmap(saa->saa7146_mem); | ||
2032 | err: | ||
2033 | return retval; | ||
2065 | } | 2034 | } |
2066 | 2035 | ||
2067 | static int __devinit init_saa7146(int i, struct device *dev) | 2036 | static int __devinit init_saa7146(struct pci_dev *pdev) |
2068 | { | 2037 | { |
2069 | struct saa7146 *saa = &saa7146s[i]; | 2038 | struct saa7146 *saa = pci_get_drvdata(pdev); |
2070 | 2039 | ||
2071 | memset(saa, 0, sizeof(*saa)); | 2040 | memset(saa, 0, sizeof(*saa)); |
2072 | saa->user = 0; | 2041 | saa->user = 0; |
@@ -2101,8 +2070,8 @@ static int __devinit init_saa7146(int i, struct device *dev) | |||
2101 | 2070 | ||
2102 | /* allocate 32k dma buffer + 4k for page table */ | 2071 | /* allocate 32k dma buffer + 4k for page table */ |
2103 | if ((saa->dmadebi = kmalloc(32768 + 4096, GFP_KERNEL)) == NULL) { | 2072 | if ((saa->dmadebi = kmalloc(32768 + 4096, GFP_KERNEL)) == NULL) { |
2104 | dev_err(dev, "%d: debi kmalloc failed\n", i); | 2073 | dev_err(&pdev->dev, "%d: debi kmalloc failed\n", saa->nr); |
2105 | return -1; | 2074 | goto err; |
2106 | } | 2075 | } |
2107 | #if 0 | 2076 | #if 0 |
2108 | saa->pagedebi = saa->dmadebi + 32768; /* top 4k is for mmu */ | 2077 | saa->pagedebi = saa->dmadebi + 32768; /* top 4k is for mmu */ |
@@ -2112,37 +2081,23 @@ static int __devinit init_saa7146(int i, struct device *dev) | |||
2112 | #endif | 2081 | #endif |
2113 | saa->audhead = saa->vidhead = saa->osdhead = 0; | 2082 | saa->audhead = saa->vidhead = saa->osdhead = 0; |
2114 | saa->audtail = saa->vidtail = saa->osdtail = 0; | 2083 | saa->audtail = saa->vidtail = saa->osdtail = 0; |
2115 | if (saa->vidbuf == NULL) | 2084 | if (saa->vidbuf == NULL && (saa->vidbuf = vmalloc(524288)) == NULL) { |
2116 | if ((saa->vidbuf = vmalloc(524288)) == NULL) { | 2085 | dev_err(&pdev->dev, "%d: malloc failed\n", saa->nr); |
2117 | dev_err(dev, "%d: malloc failed\n", saa->nr); | 2086 | goto err; |
2118 | return -ENOMEM; | 2087 | } |
2119 | } | 2088 | if (saa->audbuf == NULL && (saa->audbuf = vmalloc(65536)) == NULL) { |
2120 | if (saa->audbuf == NULL) | 2089 | dev_err(&pdev->dev, "%d: malloc failed\n", saa->nr); |
2121 | if ((saa->audbuf = vmalloc(65536)) == NULL) { | 2090 | goto errvid; |
2122 | dev_err(dev, "%d: malloc failed\n", saa->nr); | 2091 | } |
2123 | vfree(saa->vidbuf); | 2092 | if (saa->osdbuf == NULL && (saa->osdbuf = vmalloc(131072)) == NULL) { |
2124 | saa->vidbuf = NULL; | 2093 | dev_err(&pdev->dev, "%d: malloc failed\n", saa->nr); |
2125 | return -ENOMEM; | 2094 | goto erraud; |
2126 | } | 2095 | } |
2127 | if (saa->osdbuf == NULL) | ||
2128 | if ((saa->osdbuf = vmalloc(131072)) == NULL) { | ||
2129 | dev_err(dev, "%d: malloc failed\n", saa->nr); | ||
2130 | vfree(saa->vidbuf); | ||
2131 | vfree(saa->audbuf); | ||
2132 | saa->vidbuf = saa->audbuf = NULL; | ||
2133 | return -ENOMEM; | ||
2134 | } | ||
2135 | /* allocate 81920 byte buffer for clipping */ | 2096 | /* allocate 81920 byte buffer for clipping */ |
2136 | if ((saa->dmavid2 = kmalloc(VIDEO_CLIPMAP_SIZE, GFP_KERNEL)) == NULL) { | 2097 | if ((saa->dmavid2 = kzalloc(VIDEO_CLIPMAP_SIZE, GFP_KERNEL)) == NULL) { |
2137 | dev_err(dev, "%d: clip kmalloc failed\n", saa->nr); | 2098 | dev_err(&pdev->dev, "%d: clip kmalloc failed\n", saa->nr); |
2138 | vfree(saa->vidbuf); | 2099 | goto errosd; |
2139 | vfree(saa->audbuf); | ||
2140 | vfree(saa->osdbuf); | ||
2141 | saa->vidbuf = saa->audbuf = saa->osdbuf = NULL; | ||
2142 | saa->dmavid2 = NULL; | ||
2143 | return -1; | ||
2144 | } | 2100 | } |
2145 | memset(saa->dmavid2, 0x00, VIDEO_CLIPMAP_SIZE); /* clip everything */ | ||
2146 | /* setup clipping registers */ | 2101 | /* setup clipping registers */ |
2147 | saawrite(virt_to_bus(saa->dmavid2), SAA7146_BASE_EVEN2); | 2102 | saawrite(virt_to_bus(saa->dmavid2), SAA7146_BASE_EVEN2); |
2148 | saawrite(virt_to_bus(saa->dmavid2) + 128, SAA7146_BASE_ODD2); | 2103 | saawrite(virt_to_bus(saa->dmavid2) + 128, SAA7146_BASE_ODD2); |
@@ -2153,14 +2108,25 @@ static int __devinit init_saa7146(int i, struct device *dev) | |||
2153 | saawrite(((SAA7146_MC2_UPLD_DMA2) << 16) | SAA7146_MC2_UPLD_DMA2, | 2108 | saawrite(((SAA7146_MC2_UPLD_DMA2) << 16) | SAA7146_MC2_UPLD_DMA2, |
2154 | SAA7146_MC2); | 2109 | SAA7146_MC2); |
2155 | I2CBusScan(saa); | 2110 | I2CBusScan(saa); |
2111 | |||
2156 | return 0; | 2112 | return 0; |
2113 | errosd: | ||
2114 | vfree(saa->osdbuf); | ||
2115 | saa->osdbuf = NULL; | ||
2116 | erraud: | ||
2117 | vfree(saa->audbuf); | ||
2118 | saa->audbuf = NULL; | ||
2119 | errvid: | ||
2120 | vfree(saa->vidbuf); | ||
2121 | saa->vidbuf = NULL; | ||
2122 | err: | ||
2123 | return -ENOMEM; | ||
2157 | } | 2124 | } |
2158 | 2125 | ||
2159 | static void stradis_release_saa(struct pci_dev *pdev) | 2126 | static void stradis_release_saa(struct pci_dev *pdev) |
2160 | { | 2127 | { |
2161 | u8 command; | 2128 | u8 command; |
2162 | int i = (int)pci_get_drvdata(pdev); | 2129 | struct saa7146 *saa = pci_get_drvdata(pdev); |
2163 | struct saa7146 *saa = &saa7146s[i]; | ||
2164 | 2130 | ||
2165 | /* turn off all capturing, DMA and IRQs */ | 2131 | /* turn off all capturing, DMA and IRQs */ |
2166 | saawrite(0xffff0000, SAA7146_MC1); /* reset chip */ | 2132 | saawrite(0xffff0000, SAA7146_MC1); /* reset chip */ |
@@ -2211,7 +2177,7 @@ static int __devinit stradis_probe(struct pci_dev *pdev, | |||
2211 | else | 2177 | else |
2212 | dev_info(&pdev->dev, "%d: SDM2xx found\n", saa_num); | 2178 | dev_info(&pdev->dev, "%d: SDM2xx found\n", saa_num); |
2213 | 2179 | ||
2214 | pci_set_drvdata(pdev, (void *)saa_num); | 2180 | pci_set_drvdata(pdev, &saa7146s[saa_num]); |
2215 | 2181 | ||
2216 | retval = configure_saa7146(pdev, saa_num); | 2182 | retval = configure_saa7146(pdev, saa_num); |
2217 | if (retval) { | 2183 | if (retval) { |
@@ -2219,7 +2185,7 @@ static int __devinit stradis_probe(struct pci_dev *pdev, | |||
2219 | goto err; | 2185 | goto err; |
2220 | } | 2186 | } |
2221 | 2187 | ||
2222 | if (init_saa7146(saa_num, &pdev->dev) < 0) { | 2188 | if (init_saa7146(pdev) < 0) { |
2223 | dev_err(&pdev->dev, "%d: error in initialization\n", saa_num); | 2189 | dev_err(&pdev->dev, "%d: error in initialization\n", saa_num); |
2224 | retval = -EIO; | 2190 | retval = -EIO; |
2225 | goto errrel; | 2191 | goto errrel; |