Commit 72f86d08 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'pcmcia-next' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo/linux

Pull pcmcia fixes from Dominik Brodowski:
 "These are just a few odd fixes and improvements to the PCMCIA core and
  to a few PCMCIA device drivers"

* 'pcmcia-next' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo/linux:
  pcmcia: Implement CLKRUN protocol disabling for Ricoh bridges
  pcmcia: pcmcia_resource: Replace mdelay() with msleep()
  pcmcia: add error handling for pcmcia_enable_device in qlogic_stub
  char: pcmcia: cm4000_cs: Replace mdelay with usleep_range in set_protocol
  pcmcia: Use module_pcmcia_driver for scsi drivers
  pcmcia: remove KERN_INFO level from debug message
parents c403993a 95691e3e
...@@ -530,7 +530,7 @@ static int set_protocol(struct cm4000_dev *dev, struct ptsreq *ptsreq) ...@@ -530,7 +530,7 @@ static int set_protocol(struct cm4000_dev *dev, struct ptsreq *ptsreq)
DEBUGP(5, dev, "NumRecBytes is valid\n"); DEBUGP(5, dev, "NumRecBytes is valid\n");
break; break;
} }
mdelay(10); usleep_range(10000, 11000);
} }
if (i == 100) { if (i == 100) {
DEBUGP(5, dev, "Timeout waiting for NumRecBytes getting " DEBUGP(5, dev, "Timeout waiting for NumRecBytes getting "
...@@ -546,7 +546,7 @@ static int set_protocol(struct cm4000_dev *dev, struct ptsreq *ptsreq) ...@@ -546,7 +546,7 @@ static int set_protocol(struct cm4000_dev *dev, struct ptsreq *ptsreq)
DEBUGP(2, dev, "NumRecBytes = %i\n", num_bytes_read); DEBUGP(2, dev, "NumRecBytes = %i\n", num_bytes_read);
break; break;
} }
mdelay(10); usleep_range(10000, 11000);
} }
/* check whether it is a short PTS reply? */ /* check whether it is a short PTS reply? */
......
...@@ -505,7 +505,7 @@ static void cm4040_reader_release(struct pcmcia_device *link) ...@@ -505,7 +505,7 @@ static void cm4040_reader_release(struct pcmcia_device *link)
DEBUGP(3, dev, "-> cm4040_reader_release\n"); DEBUGP(3, dev, "-> cm4040_reader_release\n");
while (link->open) { while (link->open) {
DEBUGP(3, dev, KERN_INFO MODULE_NAME ": delaying release " DEBUGP(3, dev, MODULE_NAME ": delaying release "
"until process has terminated\n"); "until process has terminated\n");
wait_event(dev->devq, (link->open == 0)); wait_event(dev->devq, (link->open == 0));
} }
......
...@@ -284,7 +284,7 @@ int pcmcia_fixup_iowidth(struct pcmcia_device *p_dev) ...@@ -284,7 +284,7 @@ int pcmcia_fixup_iowidth(struct pcmcia_device *p_dev)
io_on.stop = s->io[i].res->end; io_on.stop = s->io[i].res->end;
s->ops->set_io_map(s, &io_off); s->ops->set_io_map(s, &io_off);
mdelay(40); msleep(40);
s->ops->set_io_map(s, &io_on); s->ops->set_io_map(s, &io_on);
} }
unlock: unlock:
...@@ -567,7 +567,7 @@ int pcmcia_enable_device(struct pcmcia_device *p_dev) ...@@ -567,7 +567,7 @@ int pcmcia_enable_device(struct pcmcia_device *p_dev)
!(flags & CONF_ENABLE_PULSE_IRQ)) !(flags & CONF_ENABLE_PULSE_IRQ))
option |= COR_LEVEL_REQ; option |= COR_LEVEL_REQ;
pcmcia_write_cis_mem(s, 1, (base + CISREG_COR)>>1, 1, &option); pcmcia_write_cis_mem(s, 1, (base + CISREG_COR)>>1, 1, &option);
mdelay(40); msleep(40);
} }
if (p_dev->config_regs & PRESENT_STATUS) if (p_dev->config_regs & PRESENT_STATUS)
pcmcia_write_cis_mem(s, 1, (base + CISREG_CCSR)>>1, 1, &status); pcmcia_write_cis_mem(s, 1, (base + CISREG_CCSR)>>1, 1, &status);
......
...@@ -119,6 +119,10 @@ ...@@ -119,6 +119,10 @@
#define RL5C4XX_MISC_CONTROL 0x2F /* 8 bit */ #define RL5C4XX_MISC_CONTROL 0x2F /* 8 bit */
#define RL5C4XX_ZV_ENABLE 0x08 #define RL5C4XX_ZV_ENABLE 0x08
/* Misc Control 3 Register */
#define RL5C4XX_MISC3 0x00A2 /* 16 bit */
#define RL5C47X_MISC3_CB_CLKRUN_DIS BIT(1)
#ifdef __YENTA_H #ifdef __YENTA_H
#define rl_misc(socket) ((socket)->private[0]) #define rl_misc(socket) ((socket)->private[0])
...@@ -156,6 +160,35 @@ static void ricoh_set_zv(struct yenta_socket *socket) ...@@ -156,6 +160,35 @@ static void ricoh_set_zv(struct yenta_socket *socket)
} }
} }
static void ricoh_set_clkrun(struct yenta_socket *socket, bool quiet)
{
u16 misc3;
/*
* RL5C475II likely has this setting, too, however no datasheet
* is publicly available for this chip
*/
if (socket->dev->device != PCI_DEVICE_ID_RICOH_RL5C476 &&
socket->dev->device != PCI_DEVICE_ID_RICOH_RL5C478)
return;
if (socket->dev->revision < 0x80)
return;
misc3 = config_readw(socket, RL5C4XX_MISC3);
if (misc3 & RL5C47X_MISC3_CB_CLKRUN_DIS) {
if (!quiet)
dev_dbg(&socket->dev->dev,
"CLKRUN feature already disabled\n");
} else if (disable_clkrun) {
if (!quiet)
dev_info(&socket->dev->dev,
"Disabling CLKRUN feature\n");
misc3 |= RL5C47X_MISC3_CB_CLKRUN_DIS;
config_writew(socket, RL5C4XX_MISC3, misc3);
}
}
static void ricoh_save_state(struct yenta_socket *socket) static void ricoh_save_state(struct yenta_socket *socket)
{ {
rl_misc(socket) = config_readw(socket, RL5C4XX_MISC); rl_misc(socket) = config_readw(socket, RL5C4XX_MISC);
...@@ -172,6 +205,7 @@ static void ricoh_restore_state(struct yenta_socket *socket) ...@@ -172,6 +205,7 @@ static void ricoh_restore_state(struct yenta_socket *socket)
config_writew(socket, RL5C4XX_16BIT_IO_0, rl_io(socket)); config_writew(socket, RL5C4XX_16BIT_IO_0, rl_io(socket));
config_writew(socket, RL5C4XX_16BIT_MEM_0, rl_mem(socket)); config_writew(socket, RL5C4XX_16BIT_MEM_0, rl_mem(socket));
config_writew(socket, RL5C4XX_CONFIG, rl_config(socket)); config_writew(socket, RL5C4XX_CONFIG, rl_config(socket));
ricoh_set_clkrun(socket, true);
} }
...@@ -197,6 +231,7 @@ static int ricoh_override(struct yenta_socket *socket) ...@@ -197,6 +231,7 @@ static int ricoh_override(struct yenta_socket *socket)
config_writew(socket, RL5C4XX_CONFIG, config); config_writew(socket, RL5C4XX_CONFIG, config);
ricoh_set_zv(socket); ricoh_set_zv(socket);
ricoh_set_clkrun(socket, false);
return 0; return 0;
} }
......
...@@ -26,7 +26,8 @@ ...@@ -26,7 +26,8 @@
static bool disable_clkrun; static bool disable_clkrun;
module_param(disable_clkrun, bool, 0444); module_param(disable_clkrun, bool, 0444);
MODULE_PARM_DESC(disable_clkrun, "If PC card doesn't function properly, please try this option"); MODULE_PARM_DESC(disable_clkrun,
"If PC card doesn't function properly, please try this option (TI and Ricoh bridges only)");
static bool isa_probe = 1; static bool isa_probe = 1;
module_param(isa_probe, bool, 0444); module_param(isa_probe, bool, 0444);
......
...@@ -220,16 +220,4 @@ static struct pcmcia_driver aha152x_cs_driver = { ...@@ -220,16 +220,4 @@ static struct pcmcia_driver aha152x_cs_driver = {
.id_table = aha152x_ids, .id_table = aha152x_ids,
.resume = aha152x_resume, .resume = aha152x_resume,
}; };
module_pcmcia_driver(aha152x_cs_driver);
static int __init init_aha152x_cs(void)
{
return pcmcia_register_driver(&aha152x_cs_driver);
}
static void __exit exit_aha152x_cs(void)
{
pcmcia_unregister_driver(&aha152x_cs_driver);
}
module_init(init_aha152x_cs);
module_exit(exit_aha152x_cs);
...@@ -1742,19 +1742,6 @@ static struct pcmcia_driver nsp_driver = { ...@@ -1742,19 +1742,6 @@ static struct pcmcia_driver nsp_driver = {
.suspend = nsp_cs_suspend, .suspend = nsp_cs_suspend,
.resume = nsp_cs_resume, .resume = nsp_cs_resume,
}; };
module_pcmcia_driver(nsp_driver);
static int __init nsp_cs_init(void)
{
return pcmcia_register_driver(&nsp_driver);
}
static void __exit nsp_cs_exit(void)
{
pcmcia_unregister_driver(&nsp_driver);
}
module_init(nsp_cs_init)
module_exit(nsp_cs_exit)
/* end */ /* end */
...@@ -326,10 +326,6 @@ static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht); ...@@ -326,10 +326,6 @@ static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht);
/* Interrupt handler */ /* Interrupt handler */
//static irqreturn_t nspintr(int irq, void *dev_id); //static irqreturn_t nspintr(int irq, void *dev_id);
/* Module entry point*/
static int __init nsp_cs_init(void);
static void __exit nsp_cs_exit(void);
/* Debug */ /* Debug */
#ifdef NSP_DEBUG #ifdef NSP_DEBUG
static void show_command (struct scsi_cmnd *SCpnt); static void show_command (struct scsi_cmnd *SCpnt);
......
...@@ -254,8 +254,12 @@ static void qlogic_release(struct pcmcia_device *link) ...@@ -254,8 +254,12 @@ static void qlogic_release(struct pcmcia_device *link)
static int qlogic_resume(struct pcmcia_device *link) static int qlogic_resume(struct pcmcia_device *link)
{ {
scsi_info_t *info = link->priv; scsi_info_t *info = link->priv;
int ret;
ret = pcmcia_enable_device(link);
if (ret)
return ret;
pcmcia_enable_device(link);
if ((info->manf_id == MANFID_MACNICA) || if ((info->manf_id == MANFID_MACNICA) ||
(info->manf_id == MANFID_PIONEER) || (info->manf_id == MANFID_PIONEER) ||
(info->manf_id == 0x0098)) { (info->manf_id == 0x0098)) {
...@@ -300,18 +304,7 @@ static struct pcmcia_driver qlogic_cs_driver = { ...@@ -300,18 +304,7 @@ static struct pcmcia_driver qlogic_cs_driver = {
.resume = qlogic_resume, .resume = qlogic_resume,
}; };
static int __init init_qlogic_cs(void)
{
return pcmcia_register_driver(&qlogic_cs_driver);
}
static void __exit exit_qlogic_cs(void)
{
pcmcia_unregister_driver(&qlogic_cs_driver);
}
MODULE_AUTHOR("Tom Zerucha, Michael Griffith"); MODULE_AUTHOR("Tom Zerucha, Michael Griffith");
MODULE_DESCRIPTION("Driver for the PCMCIA Qlogic FAS SCSI controllers"); MODULE_DESCRIPTION("Driver for the PCMCIA Qlogic FAS SCSI controllers");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
module_init(init_qlogic_cs); module_pcmcia_driver(qlogic_cs_driver);
module_exit(exit_qlogic_cs);
...@@ -880,18 +880,4 @@ static struct pcmcia_driver sym53c500_cs_driver = { ...@@ -880,18 +880,4 @@ static struct pcmcia_driver sym53c500_cs_driver = {
.id_table = sym53c500_ids, .id_table = sym53c500_ids,
.resume = sym53c500_resume, .resume = sym53c500_resume,
}; };
module_pcmcia_driver(sym53c500_cs_driver);
static int __init
init_sym53c500_cs(void)
{
return pcmcia_register_driver(&sym53c500_cs_driver);
}
static void __exit
exit_sym53c500_cs(void)
{
pcmcia_unregister_driver(&sym53c500_cs_driver);
}
module_init(init_sym53c500_cs);
module_exit(exit_sym53c500_cs);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment