Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-2.6: drivers: fix dma_get_required_mask firmware: provide stubs for the FW_LOADER=n case nozomi: fix initialization and early flow control access sysdev: fix problem with sysdev_class being re-registered
This commit is contained in:
commit
ee215ca3b2
@ -648,7 +648,7 @@ u64 dma_get_required_mask(struct device *dev)
|
|||||||
high_totalram += high_totalram - 1;
|
high_totalram += high_totalram - 1;
|
||||||
mask = (((u64)high_totalram) << 32) + 0xffffffff;
|
mask = (((u64)high_totalram) << 32) + 0xffffffff;
|
||||||
}
|
}
|
||||||
return mask & *dev->dma_mask;
|
return mask;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(dma_get_required_mask);
|
EXPORT_SYMBOL_GPL(dma_get_required_mask);
|
||||||
#endif
|
#endif
|
||||||
|
@ -133,6 +133,7 @@ int sysdev_class_register(struct sysdev_class * cls)
|
|||||||
pr_debug("Registering sysdev class '%s'\n",
|
pr_debug("Registering sysdev class '%s'\n",
|
||||||
kobject_name(&cls->kset.kobj));
|
kobject_name(&cls->kset.kobj));
|
||||||
INIT_LIST_HEAD(&cls->drivers);
|
INIT_LIST_HEAD(&cls->drivers);
|
||||||
|
memset(&cls->kset.kobj, 0x00, sizeof(struct kobject));
|
||||||
cls->kset.kobj.parent = &system_kset->kobj;
|
cls->kset.kobj.parent = &system_kset->kobj;
|
||||||
cls->kset.kobj.ktype = &ktype_sysdev_class;
|
cls->kset.kobj.ktype = &ktype_sysdev_class;
|
||||||
cls->kset.kobj.kset = system_kset;
|
cls->kset.kobj.kset = system_kset;
|
||||||
@ -227,6 +228,9 @@ int sysdev_register(struct sys_device * sysdev)
|
|||||||
|
|
||||||
pr_debug("Registering sys device '%s'\n", kobject_name(&sysdev->kobj));
|
pr_debug("Registering sys device '%s'\n", kobject_name(&sysdev->kobj));
|
||||||
|
|
||||||
|
/* initialize the kobject to 0, in case it had previously been used */
|
||||||
|
memset(&sysdev->kobj, 0x00, sizeof(struct kobject));
|
||||||
|
|
||||||
/* Make sure the kset is set */
|
/* Make sure the kset is set */
|
||||||
sysdev->kobj.kset = &cls->kset;
|
sysdev->kobj.kset = &cls->kset;
|
||||||
|
|
||||||
|
@ -190,6 +190,14 @@ enum card_type {
|
|||||||
F32_8 = 8192, /* 3072 bytes downl. + 1024 bytes uplink * 2 -> 8192 */
|
F32_8 = 8192, /* 3072 bytes downl. + 1024 bytes uplink * 2 -> 8192 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Initialization states a card can be in */
|
||||||
|
enum card_state {
|
||||||
|
NOZOMI_STATE_UKNOWN = 0,
|
||||||
|
NOZOMI_STATE_ENABLED = 1, /* pci device enabled */
|
||||||
|
NOZOMI_STATE_ALLOCATED = 2, /* config setup done */
|
||||||
|
NOZOMI_STATE_READY = 3, /* flowcontrols received */
|
||||||
|
};
|
||||||
|
|
||||||
/* Two different toggle channels exist */
|
/* Two different toggle channels exist */
|
||||||
enum channel_type {
|
enum channel_type {
|
||||||
CH_A = 0,
|
CH_A = 0,
|
||||||
@ -385,6 +393,7 @@ struct nozomi {
|
|||||||
spinlock_t spin_mutex; /* secures access to registers and tty */
|
spinlock_t spin_mutex; /* secures access to registers and tty */
|
||||||
|
|
||||||
unsigned int index_start;
|
unsigned int index_start;
|
||||||
|
enum card_state state;
|
||||||
u32 open_ttys;
|
u32 open_ttys;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -686,6 +695,7 @@ static int nozomi_read_config_table(struct nozomi *dc)
|
|||||||
dc->last_ier = dc->last_ier | CTRL_DL;
|
dc->last_ier = dc->last_ier | CTRL_DL;
|
||||||
writew(dc->last_ier, dc->reg_ier);
|
writew(dc->last_ier, dc->reg_ier);
|
||||||
|
|
||||||
|
dc->state = NOZOMI_STATE_ALLOCATED;
|
||||||
dev_info(&dc->pdev->dev, "Initialization OK!\n");
|
dev_info(&dc->pdev->dev, "Initialization OK!\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -944,6 +954,14 @@ static int receive_flow_control(struct nozomi *dc)
|
|||||||
case CTRL_APP2:
|
case CTRL_APP2:
|
||||||
port = PORT_APP2;
|
port = PORT_APP2;
|
||||||
enable_ier = APP2_DL;
|
enable_ier = APP2_DL;
|
||||||
|
if (dc->state == NOZOMI_STATE_ALLOCATED) {
|
||||||
|
/*
|
||||||
|
* After card initialization the flow control
|
||||||
|
* received for APP2 is always the last
|
||||||
|
*/
|
||||||
|
dc->state = NOZOMI_STATE_READY;
|
||||||
|
dev_info(&dc->pdev->dev, "Device READY!\n");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
dev_err(&dc->pdev->dev,
|
dev_err(&dc->pdev->dev,
|
||||||
@ -1366,22 +1384,12 @@ static int __devinit nozomi_card_init(struct pci_dev *pdev,
|
|||||||
|
|
||||||
dc->pdev = pdev;
|
dc->pdev = pdev;
|
||||||
|
|
||||||
/* Find out what card type it is */
|
|
||||||
nozomi_get_card_type(dc);
|
|
||||||
|
|
||||||
ret = pci_enable_device(dc->pdev);
|
ret = pci_enable_device(dc->pdev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&pdev->dev, "Failed to enable PCI Device\n");
|
dev_err(&pdev->dev, "Failed to enable PCI Device\n");
|
||||||
goto err_free;
|
goto err_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
start = pci_resource_start(dc->pdev, 0);
|
|
||||||
if (start == 0) {
|
|
||||||
dev_err(&pdev->dev, "No I/O address for card detected\n");
|
|
||||||
ret = -ENODEV;
|
|
||||||
goto err_disable_device;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = pci_request_regions(dc->pdev, NOZOMI_NAME);
|
ret = pci_request_regions(dc->pdev, NOZOMI_NAME);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&pdev->dev, "I/O address 0x%04x already in use\n",
|
dev_err(&pdev->dev, "I/O address 0x%04x already in use\n",
|
||||||
@ -1389,6 +1397,16 @@ static int __devinit nozomi_card_init(struct pci_dev *pdev,
|
|||||||
goto err_disable_device;
|
goto err_disable_device;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
start = pci_resource_start(dc->pdev, 0);
|
||||||
|
if (start == 0) {
|
||||||
|
dev_err(&pdev->dev, "No I/O address for card detected\n");
|
||||||
|
ret = -ENODEV;
|
||||||
|
goto err_rel_regs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find out what card type it is */
|
||||||
|
nozomi_get_card_type(dc);
|
||||||
|
|
||||||
dc->base_addr = ioremap(start, dc->card_type);
|
dc->base_addr = ioremap(start, dc->card_type);
|
||||||
if (!dc->base_addr) {
|
if (!dc->base_addr) {
|
||||||
dev_err(&pdev->dev, "Unable to map card MMIO\n");
|
dev_err(&pdev->dev, "Unable to map card MMIO\n");
|
||||||
@ -1425,6 +1443,14 @@ static int __devinit nozomi_card_init(struct pci_dev *pdev,
|
|||||||
dc->index_start = ndev_idx * MAX_PORT;
|
dc->index_start = ndev_idx * MAX_PORT;
|
||||||
ndevs[ndev_idx] = dc;
|
ndevs[ndev_idx] = dc;
|
||||||
|
|
||||||
|
pci_set_drvdata(pdev, dc);
|
||||||
|
|
||||||
|
/* Enable RESET interrupt */
|
||||||
|
dc->last_ier = RESET;
|
||||||
|
iowrite16(dc->last_ier, dc->reg_ier);
|
||||||
|
|
||||||
|
dc->state = NOZOMI_STATE_ENABLED;
|
||||||
|
|
||||||
for (i = 0; i < MAX_PORT; i++) {
|
for (i = 0; i < MAX_PORT; i++) {
|
||||||
mutex_init(&dc->port[i].tty_sem);
|
mutex_init(&dc->port[i].tty_sem);
|
||||||
dc->port[i].tty_open_count = 0;
|
dc->port[i].tty_open_count = 0;
|
||||||
@ -1433,12 +1459,6 @@ static int __devinit nozomi_card_init(struct pci_dev *pdev,
|
|||||||
&pdev->dev);
|
&pdev->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Enable RESET interrupt. */
|
|
||||||
dc->last_ier = RESET;
|
|
||||||
writew(dc->last_ier, dc->reg_ier);
|
|
||||||
|
|
||||||
pci_set_drvdata(pdev, dc);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_free_sbuf:
|
err_free_sbuf:
|
||||||
@ -1553,7 +1573,7 @@ static int ntty_open(struct tty_struct *tty, struct file *file)
|
|||||||
struct nozomi *dc = get_dc_by_tty(tty);
|
struct nozomi *dc = get_dc_by_tty(tty);
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
if (!port || !dc)
|
if (!port || !dc || dc->state != NOZOMI_STATE_READY)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
if (mutex_lock_interruptible(&port->tty_sem))
|
if (mutex_lock_interruptible(&port->tty_sem))
|
||||||
@ -1716,6 +1736,10 @@ static int ntty_tiocmget(struct tty_struct *tty, struct file *file)
|
|||||||
static int ntty_tiocmset(struct tty_struct *tty, struct file *file,
|
static int ntty_tiocmset(struct tty_struct *tty, struct file *file,
|
||||||
unsigned int set, unsigned int clear)
|
unsigned int set, unsigned int clear)
|
||||||
{
|
{
|
||||||
|
struct nozomi *dc = get_dc_by_tty(tty);
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&dc->spin_mutex, flags);
|
||||||
if (set & TIOCM_RTS)
|
if (set & TIOCM_RTS)
|
||||||
set_rts(tty, 1);
|
set_rts(tty, 1);
|
||||||
else if (clear & TIOCM_RTS)
|
else if (clear & TIOCM_RTS)
|
||||||
@ -1725,6 +1749,7 @@ static int ntty_tiocmset(struct tty_struct *tty, struct file *file,
|
|||||||
set_dtr(tty, 1);
|
set_dtr(tty, 1);
|
||||||
else if (clear & TIOCM_DTR)
|
else if (clear & TIOCM_DTR)
|
||||||
set_dtr(tty, 0);
|
set_dtr(tty, 0);
|
||||||
|
spin_unlock_irqrestore(&dc->spin_mutex, flags);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1762,7 +1787,7 @@ static int ntty_ioctl_tiocgicount(struct port *port, void __user *argp)
|
|||||||
icount.brk = cnow.brk;
|
icount.brk = cnow.brk;
|
||||||
icount.buf_overrun = cnow.buf_overrun;
|
icount.buf_overrun = cnow.buf_overrun;
|
||||||
|
|
||||||
return copy_to_user(argp, &icount, sizeof(icount));
|
return copy_to_user(argp, &icount, sizeof(icount)) ? -EFAULT : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ntty_ioctl(struct tty_struct *tty, struct file *file,
|
static int ntty_ioctl(struct tty_struct *tty, struct file *file,
|
||||||
|
@ -10,7 +10,10 @@ struct firmware {
|
|||||||
size_t size;
|
size_t size;
|
||||||
u8 *data;
|
u8 *data;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct device;
|
struct device;
|
||||||
|
|
||||||
|
#if defined(CONFIG_FW_LOADER) || defined(CONFIG_FW_LOADER_MODULE)
|
||||||
int request_firmware(const struct firmware **fw, const char *name,
|
int request_firmware(const struct firmware **fw, const char *name,
|
||||||
struct device *device);
|
struct device *device);
|
||||||
int request_firmware_nowait(
|
int request_firmware_nowait(
|
||||||
@ -19,4 +22,24 @@ int request_firmware_nowait(
|
|||||||
void (*cont)(const struct firmware *fw, void *context));
|
void (*cont)(const struct firmware *fw, void *context));
|
||||||
|
|
||||||
void release_firmware(const struct firmware *fw);
|
void release_firmware(const struct firmware *fw);
|
||||||
|
#else
|
||||||
|
static inline int request_firmware(const struct firmware **fw,
|
||||||
|
const char *name,
|
||||||
|
struct device *device)
|
||||||
|
{
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
static inline int request_firmware_nowait(
|
||||||
|
struct module *module, int uevent,
|
||||||
|
const char *name, struct device *device, void *context,
|
||||||
|
void (*cont)(const struct firmware *fw, void *context))
|
||||||
|
{
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void release_firmware(const struct firmware *fw)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user