mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6: (22 commits)
pcmcia: synclink_cs: fix information leak to userland
pcmcia: don't call flush_scheduled_work() spuriously
serial_cs: drop spurious flush_scheduled_work() call
pcmcia/yenta: guide users in case of problems with O2-bridges
pcmcia: fix unused function compile warning
pcmcia: vrc4173_cardu: Fix error path for pci_release_regions and pci_disable_device
pcmcia: add a few debug statements
pcmcia: remove obsolete and wrong comments
pcmcia: avoid messages on module (un)loading
pcmcia: move driver name to struct pcmcia_driver
pcmcia: remove the "Finally, report what we've done" message
pcmcia: use autoconfiguration feature for ioports and iomem
pcmcia: introduce autoconfiguration feature
pcmcia: Documentation update
pcmcia: convert pcmcia_request_configuration to pcmcia_enable_device
pcmcia: move config_{base,index,regs} to struct pcmcia_device
pcmcia: simplify IntType
pcmcia: simplify Status, ExtStatus register access
pcmcia: remove Pin, Copy configuration register access
pcmcia: move Vpp setup to struct pcmcia_device
...
This commit is contained in:
commit
b65378898c
96 changed files with 1327 additions and 4135 deletions
|
|
@ -16,7 +16,6 @@
|
|||
#include <asm/io.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
||||
|
|
@ -101,7 +100,7 @@ MODULE_PARM_DESC(mem_type, "Set Memory type (0=Flash, 1=RAM, 2=ROM, default=0)")
|
|||
static caddr_t remap_window(struct map_info *map, unsigned long to)
|
||||
{
|
||||
struct pcmciamtd_dev *dev = (struct pcmciamtd_dev *)map->map_priv_1;
|
||||
window_handle_t win = (window_handle_t)map->map_priv_2;
|
||||
struct resource *win = (struct resource *) map->map_priv_2;
|
||||
unsigned int offset;
|
||||
int ret;
|
||||
|
||||
|
|
@ -316,30 +315,19 @@ static void pcmciamtd_set_vpp(struct map_info *map, int on)
|
|||
{
|
||||
struct pcmciamtd_dev *dev = (struct pcmciamtd_dev *)map->map_priv_1;
|
||||
struct pcmcia_device *link = dev->p_dev;
|
||||
modconf_t mod;
|
||||
int ret;
|
||||
|
||||
mod.Attributes = CONF_VPP1_CHANGE_VALID | CONF_VPP2_CHANGE_VALID;
|
||||
mod.Vcc = 0;
|
||||
mod.Vpp1 = mod.Vpp2 = on ? dev->vpp : 0;
|
||||
|
||||
DEBUG(2, "dev = %p on = %d vpp = %d\n", dev, on, dev->vpp);
|
||||
ret = pcmcia_modify_configuration(link, &mod);
|
||||
pcmcia_fixup_vpp(link, on ? dev->vpp : 0);
|
||||
}
|
||||
|
||||
|
||||
/* After a card is removed, pcmciamtd_release() will unregister the
|
||||
* device, and release the PCMCIA configuration. If the device is
|
||||
* still open, this will be postponed until it is closed.
|
||||
*/
|
||||
|
||||
static void pcmciamtd_release(struct pcmcia_device *link)
|
||||
{
|
||||
struct pcmciamtd_dev *dev = link->priv;
|
||||
|
||||
DEBUG(3, "link = 0x%p", link);
|
||||
|
||||
if (link->win) {
|
||||
if (link->resource[2]->end) {
|
||||
if(dev->win_base) {
|
||||
iounmap(dev->win_base);
|
||||
dev->win_base = NULL;
|
||||
|
|
@ -482,18 +470,12 @@ static void card_settings(struct pcmciamtd_dev *dev, struct pcmcia_device *p_dev
|
|||
}
|
||||
|
||||
|
||||
/* pcmciamtd_config() is scheduled to run after a CARD_INSERTION event
|
||||
* is received, to configure the PCMCIA socket, and to make the
|
||||
* MTD device available to the system.
|
||||
*/
|
||||
|
||||
static int pcmciamtd_config(struct pcmcia_device *link)
|
||||
{
|
||||
struct pcmciamtd_dev *dev = link->priv;
|
||||
struct mtd_info *mtd = NULL;
|
||||
win_req_t req;
|
||||
int ret;
|
||||
int i;
|
||||
int i, j = 0;
|
||||
static char *probes[] = { "jedec_probe", "cfi_probe" };
|
||||
int new_name = 0;
|
||||
|
||||
|
|
@ -520,28 +502,34 @@ static int pcmciamtd_config(struct pcmcia_device *link)
|
|||
* smaller windows until we succeed
|
||||
*/
|
||||
|
||||
req.Attributes = WIN_MEMORY_TYPE_CM | WIN_ENABLE;
|
||||
req.Attributes |= (dev->pcmcia_map.bankwidth == 1) ? WIN_DATA_WIDTH_8 : WIN_DATA_WIDTH_16;
|
||||
req.Base = 0;
|
||||
req.AccessSpeed = mem_speed;
|
||||
link->win = (window_handle_t)link;
|
||||
req.Size = (force_size) ? force_size << 20 : MAX_PCMCIA_ADDR;
|
||||
link->resource[2]->flags |= WIN_MEMORY_TYPE_CM | WIN_ENABLE;
|
||||
link->resource[2]->flags |= (dev->pcmcia_map.bankwidth == 1) ?
|
||||
WIN_DATA_WIDTH_8 : WIN_DATA_WIDTH_16;
|
||||
link->resource[2]->start = 0;
|
||||
link->resource[2]->end = (force_size) ? force_size << 20 :
|
||||
MAX_PCMCIA_ADDR;
|
||||
dev->win_size = 0;
|
||||
|
||||
do {
|
||||
int ret;
|
||||
DEBUG(2, "requesting window with size = %dKiB memspeed = %d",
|
||||
req.Size >> 10, req.AccessSpeed);
|
||||
ret = pcmcia_request_window(link, &req, &link->win);
|
||||
DEBUG(2, "requesting window with size = %luKiB memspeed = %d",
|
||||
(unsigned long) resource_size(link->resource[2]) >> 10,
|
||||
mem_speed);
|
||||
ret = pcmcia_request_window(link, link->resource[2], mem_speed);
|
||||
DEBUG(2, "ret = %d dev->win_size = %d", ret, dev->win_size);
|
||||
if(ret) {
|
||||
req.Size >>= 1;
|
||||
j++;
|
||||
link->resource[2]->start = 0;
|
||||
link->resource[2]->end = (force_size) ?
|
||||
force_size << 20 : MAX_PCMCIA_ADDR;
|
||||
link->resource[2]->end >>= j;
|
||||
} else {
|
||||
DEBUG(2, "Got window of size %dKiB", req.Size >> 10);
|
||||
dev->win_size = req.Size;
|
||||
DEBUG(2, "Got window of size %luKiB", (unsigned long)
|
||||
resource_size(link->resource[2]) >> 10);
|
||||
dev->win_size = resource_size(link->resource[2]);
|
||||
break;
|
||||
}
|
||||
} while(req.Size >= 0x1000);
|
||||
} while (link->resource[2]->end >= 0x1000);
|
||||
|
||||
DEBUG(2, "dev->win_size = %d", dev->win_size);
|
||||
|
||||
|
|
@ -553,33 +541,31 @@ static int pcmciamtd_config(struct pcmcia_device *link)
|
|||
DEBUG(1, "Allocated a window of %dKiB", dev->win_size >> 10);
|
||||
|
||||
/* Get write protect status */
|
||||
DEBUG(2, "window handle = 0x%8.8lx", (unsigned long)link->win);
|
||||
dev->win_base = ioremap(req.Base, req.Size);
|
||||
dev->win_base = ioremap(link->resource[2]->start,
|
||||
resource_size(link->resource[2]));
|
||||
if(!dev->win_base) {
|
||||
dev_err(&dev->p_dev->dev, "ioremap(%lu, %u) failed\n",
|
||||
req.Base, req.Size);
|
||||
dev_err(&dev->p_dev->dev, "ioremap(%pR) failed\n",
|
||||
link->resource[2]);
|
||||
pcmciamtd_release(link);
|
||||
return -ENODEV;
|
||||
}
|
||||
DEBUG(1, "mapped window dev = %p req.base = 0x%lx base = %p size = 0x%x",
|
||||
dev, req.Base, dev->win_base, req.Size);
|
||||
DEBUG(1, "mapped window dev = %p @ %pR, base = %p",
|
||||
dev, link->resource[2], dev->win_base);
|
||||
|
||||
dev->offset = 0;
|
||||
dev->pcmcia_map.map_priv_1 = (unsigned long)dev;
|
||||
dev->pcmcia_map.map_priv_2 = (unsigned long)link->win;
|
||||
dev->pcmcia_map.map_priv_2 = (unsigned long)link->resource[2];
|
||||
|
||||
dev->vpp = (vpp) ? vpp : link->socket->socket.Vpp;
|
||||
link->conf.Attributes = 0;
|
||||
if(setvpp == 2) {
|
||||
link->conf.Vpp = dev->vpp;
|
||||
link->vpp = dev->vpp;
|
||||
} else {
|
||||
link->conf.Vpp = 0;
|
||||
link->vpp = 0;
|
||||
}
|
||||
|
||||
link->conf.IntType = INT_MEMORY;
|
||||
link->conf.ConfigIndex = 0;
|
||||
link->config_index = 0;
|
||||
DEBUG(2, "Setting Configuration");
|
||||
ret = pcmcia_request_configuration(link, &link->conf);
|
||||
ret = pcmcia_enable_device(link);
|
||||
if (ret != 0) {
|
||||
if (dev->win_base) {
|
||||
iounmap(dev->win_base);
|
||||
|
|
@ -680,12 +666,6 @@ static int pcmciamtd_resume(struct pcmcia_device *dev)
|
|||
}
|
||||
|
||||
|
||||
/* This deletes a driver "instance". The device is de-registered
|
||||
* with Card Services. If it has been released, all local data
|
||||
* structures are freed. Otherwise, the structures will be freed
|
||||
* when the device is released.
|
||||
*/
|
||||
|
||||
static void pcmciamtd_detach(struct pcmcia_device *link)
|
||||
{
|
||||
struct pcmciamtd_dev *dev = link->priv;
|
||||
|
|
@ -703,11 +683,6 @@ static void pcmciamtd_detach(struct pcmcia_device *link)
|
|||
}
|
||||
|
||||
|
||||
/* pcmciamtd_attach() creates an "instance" of the driver, allocating
|
||||
* local data structures for one device. The device is registered
|
||||
* with Card Services.
|
||||
*/
|
||||
|
||||
static int pcmciamtd_probe(struct pcmcia_device *link)
|
||||
{
|
||||
struct pcmciamtd_dev *dev;
|
||||
|
|
@ -720,9 +695,6 @@ static int pcmciamtd_probe(struct pcmcia_device *link)
|
|||
dev->p_dev = link;
|
||||
link->priv = dev;
|
||||
|
||||
link->conf.Attributes = 0;
|
||||
link->conf.IntType = INT_MEMORY;
|
||||
|
||||
return pcmciamtd_config(link);
|
||||
}
|
||||
|
||||
|
|
@ -757,9 +729,7 @@ static struct pcmcia_device_id pcmciamtd_ids[] = {
|
|||
MODULE_DEVICE_TABLE(pcmcia, pcmciamtd_ids);
|
||||
|
||||
static struct pcmcia_driver pcmciamtd_driver = {
|
||||
.drv = {
|
||||
.name = "pcmciamtd"
|
||||
},
|
||||
.name = "pcmciamtd",
|
||||
.probe = pcmciamtd_probe,
|
||||
.remove = pcmciamtd_detach,
|
||||
.owner = THIS_MODULE,
|
||||
|
|
@ -771,8 +741,6 @@ static struct pcmcia_driver pcmciamtd_driver = {
|
|||
|
||||
static int __init init_pcmciamtd(void)
|
||||
{
|
||||
info(DRIVER_DESC);
|
||||
|
||||
if(bankwidth && bankwidth != 1 && bankwidth != 2) {
|
||||
info("bad bankwidth (%d), using default", bankwidth);
|
||||
bankwidth = 2;
|
||||
|
|
|
|||
Loading…
Reference in a new issue