2005-04-17 06:20:36 +08:00
|
|
|
/*
|
|
|
|
|
|
|
|
bttv-gpio.c -- gpio sub drivers
|
|
|
|
|
|
|
|
sysfs-based sub driver interface for bttv
|
|
|
|
mainly intented for gpio access
|
|
|
|
|
|
|
|
|
|
|
|
Copyright (C) 1996,97,98 Ralph Metzler (rjkm@thp.uni-koeln.de)
|
2005-11-09 13:37:43 +08:00
|
|
|
& Marcus Metzler (mocm@thp.uni-koeln.de)
|
2005-04-17 06:20:36 +08:00
|
|
|
(c) 1999-2003 Gerd Knorr <kraxel@bytesex.org>
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <linux/module.h>
|
|
|
|
#include <linux/init.h>
|
|
|
|
#include <linux/delay.h>
|
|
|
|
#include <linux/device.h>
|
|
|
|
#include <asm/io.h>
|
|
|
|
|
|
|
|
#include "bttvp.h"
|
|
|
|
|
|
|
|
/* ----------------------------------------------------------------------- */
|
|
|
|
/* internal: the bttv "bus" */
|
|
|
|
|
|
|
|
static int bttv_sub_bus_match(struct device *dev, struct device_driver *drv)
|
|
|
|
{
|
|
|
|
struct bttv_sub_driver *sub = to_bttv_sub_drv(drv);
|
|
|
|
int len = strlen(sub->wanted);
|
|
|
|
|
V4L/DVB (9521): V4L: struct device - replace bus_id with dev_name(), dev_set_name()
This patch is part of a larger patch series which will remove
the "char bus_id[20]" name string from struct device. The device
name is managed in the kobject anyway, and without any size
limitation, and just needlessly copied into "struct device".
To set and read the device name dev_name(dev) and dev_set_name(dev)
must be used. If your code uses static kobjects, which it shouldn't
do, "const char *init_name" can be used to statically provide the
name the registered device should have. At registration time, the
init_name field is cleared, to enforce the use of dev_name(dev) to
access the device name at a later time.
We need to get rid of all occurrences of bus_id in the entire tree
to be able to enable the new interface. Please apply this patch,
and possibly convert any remaining remaining occurrences of bus_id.
We want to submit a patch to -next, which will remove bus_id from
"struct device", to find the remaining pieces to convert, and finally
switch over to the new api, which will remove the 20 bytes array
and does no longer have a size limitation.
Thanks,
Kay
Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Acked-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2008-10-30 11:51:46 +08:00
|
|
|
if (0 == strncmp(dev_name(dev), sub->wanted, len))
|
2005-04-17 06:20:36 +08:00
|
|
|
return 1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2006-01-06 19:42:03 +08:00
|
|
|
static int bttv_sub_probe(struct device *dev)
|
|
|
|
{
|
|
|
|
struct bttv_sub_device *sdev = to_bttv_sub_dev(dev);
|
|
|
|
struct bttv_sub_driver *sub = to_bttv_sub_drv(dev->driver);
|
|
|
|
|
|
|
|
return sub->probe ? sub->probe(sdev) : -ENODEV;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int bttv_sub_remove(struct device *dev)
|
|
|
|
{
|
|
|
|
struct bttv_sub_device *sdev = to_bttv_sub_dev(dev);
|
|
|
|
struct bttv_sub_driver *sub = to_bttv_sub_drv(dev->driver);
|
|
|
|
|
|
|
|
if (sub->remove)
|
|
|
|
sub->remove(sdev);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
struct bus_type bttv_sub_bus_type = {
|
2006-01-06 19:42:03 +08:00
|
|
|
.name = "bttv-sub",
|
|
|
|
.match = &bttv_sub_bus_match,
|
|
|
|
.probe = bttv_sub_probe,
|
|
|
|
.remove = bttv_sub_remove,
|
2005-04-17 06:20:36 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
static void release_sub_device(struct device *dev)
|
|
|
|
{
|
|
|
|
struct bttv_sub_device *sub = to_bttv_sub_dev(dev);
|
|
|
|
kfree(sub);
|
|
|
|
}
|
|
|
|
|
|
|
|
int bttv_sub_add_device(struct bttv_core *core, char *name)
|
|
|
|
{
|
|
|
|
struct bttv_sub_device *sub;
|
|
|
|
int err;
|
|
|
|
|
2006-01-12 05:40:56 +08:00
|
|
|
sub = kzalloc(sizeof(*sub),GFP_KERNEL);
|
2005-04-17 06:20:36 +08:00
|
|
|
if (NULL == sub)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
sub->core = core;
|
|
|
|
sub->dev.parent = &core->pci->dev;
|
|
|
|
sub->dev.bus = &bttv_sub_bus_type;
|
|
|
|
sub->dev.release = release_sub_device;
|
V4L/DVB (9521): V4L: struct device - replace bus_id with dev_name(), dev_set_name()
This patch is part of a larger patch series which will remove
the "char bus_id[20]" name string from struct device. The device
name is managed in the kobject anyway, and without any size
limitation, and just needlessly copied into "struct device".
To set and read the device name dev_name(dev) and dev_set_name(dev)
must be used. If your code uses static kobjects, which it shouldn't
do, "const char *init_name" can be used to statically provide the
name the registered device should have. At registration time, the
init_name field is cleared, to enforce the use of dev_name(dev) to
access the device name at a later time.
We need to get rid of all occurrences of bus_id in the entire tree
to be able to enable the new interface. Please apply this patch,
and possibly convert any remaining remaining occurrences of bus_id.
We want to submit a patch to -next, which will remove bus_id from
"struct device", to find the remaining pieces to convert, and finally
switch over to the new api, which will remove the 20 bytes array
and does no longer have a size limitation.
Thanks,
Kay
Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Acked-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2008-10-30 11:51:46 +08:00
|
|
|
dev_set_name(&sub->dev, "%s%d", name, core->nr);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
err = device_register(&sub->dev);
|
|
|
|
if (0 != err) {
|
|
|
|
kfree(sub);
|
|
|
|
return err;
|
|
|
|
}
|
V4L/DVB (9521): V4L: struct device - replace bus_id with dev_name(), dev_set_name()
This patch is part of a larger patch series which will remove
the "char bus_id[20]" name string from struct device. The device
name is managed in the kobject anyway, and without any size
limitation, and just needlessly copied into "struct device".
To set and read the device name dev_name(dev) and dev_set_name(dev)
must be used. If your code uses static kobjects, which it shouldn't
do, "const char *init_name" can be used to statically provide the
name the registered device should have. At registration time, the
init_name field is cleared, to enforce the use of dev_name(dev) to
access the device name at a later time.
We need to get rid of all occurrences of bus_id in the entire tree
to be able to enable the new interface. Please apply this patch,
and possibly convert any remaining remaining occurrences of bus_id.
We want to submit a patch to -next, which will remove bus_id from
"struct device", to find the remaining pieces to convert, and finally
switch over to the new api, which will remove the 20 bytes array
and does no longer have a size limitation.
Thanks,
Kay
Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Acked-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2008-10-30 11:51:46 +08:00
|
|
|
printk("bttv%d: add subdevice \"%s\"\n", core->nr, dev_name(&sub->dev));
|
2005-04-17 06:20:36 +08:00
|
|
|
list_add_tail(&sub->list,&core->subs);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int bttv_sub_del_devices(struct bttv_core *core)
|
|
|
|
{
|
2007-10-10 16:37:43 +08:00
|
|
|
struct bttv_sub_device *sub, *save;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-10-10 16:37:43 +08:00
|
|
|
list_for_each_entry_safe(sub, save, &core->subs, list) {
|
2005-04-17 06:20:36 +08:00
|
|
|
list_del(&sub->list);
|
|
|
|
device_unregister(&sub->dev);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ----------------------------------------------------------------------- */
|
|
|
|
/* external: sub-driver register/unregister */
|
|
|
|
|
|
|
|
int bttv_sub_register(struct bttv_sub_driver *sub, char *wanted)
|
|
|
|
{
|
|
|
|
sub->drv.bus = &bttv_sub_bus_type;
|
|
|
|
snprintf(sub->wanted,sizeof(sub->wanted),"%s",wanted);
|
|
|
|
return driver_register(&sub->drv);
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL(bttv_sub_register);
|
|
|
|
|
|
|
|
int bttv_sub_unregister(struct bttv_sub_driver *sub)
|
|
|
|
{
|
|
|
|
driver_unregister(&sub->drv);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL(bttv_sub_unregister);
|
|
|
|
|
|
|
|
/* ----------------------------------------------------------------------- */
|
|
|
|
/* external: gpio access functions */
|
|
|
|
|
|
|
|
void bttv_gpio_inout(struct bttv_core *core, u32 mask, u32 outbits)
|
|
|
|
{
|
|
|
|
struct bttv *btv = container_of(core, struct bttv, c);
|
|
|
|
unsigned long flags;
|
|
|
|
u32 data;
|
|
|
|
|
|
|
|
spin_lock_irqsave(&btv->gpio_lock,flags);
|
|
|
|
data = btread(BT848_GPIO_OUT_EN);
|
|
|
|
data = data & ~mask;
|
|
|
|
data = data | (mask & outbits);
|
|
|
|
btwrite(data,BT848_GPIO_OUT_EN);
|
|
|
|
spin_unlock_irqrestore(&btv->gpio_lock,flags);
|
|
|
|
}
|
|
|
|
|
|
|
|
u32 bttv_gpio_read(struct bttv_core *core)
|
|
|
|
{
|
|
|
|
struct bttv *btv = container_of(core, struct bttv, c);
|
|
|
|
u32 value;
|
|
|
|
|
|
|
|
value = btread(BT848_GPIO_DATA);
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
|
|
|
|
void bttv_gpio_write(struct bttv_core *core, u32 value)
|
|
|
|
{
|
|
|
|
struct bttv *btv = container_of(core, struct bttv, c);
|
|
|
|
|
|
|
|
btwrite(value,BT848_GPIO_DATA);
|
|
|
|
}
|
|
|
|
|
|
|
|
void bttv_gpio_bits(struct bttv_core *core, u32 mask, u32 bits)
|
|
|
|
{
|
|
|
|
struct bttv *btv = container_of(core, struct bttv, c);
|
|
|
|
unsigned long flags;
|
|
|
|
u32 data;
|
|
|
|
|
|
|
|
spin_lock_irqsave(&btv->gpio_lock,flags);
|
|
|
|
data = btread(BT848_GPIO_DATA);
|
|
|
|
data = data & ~mask;
|
|
|
|
data = data | (mask & bits);
|
|
|
|
btwrite(data,BT848_GPIO_DATA);
|
|
|
|
spin_unlock_irqrestore(&btv->gpio_lock,flags);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Local variables:
|
|
|
|
* c-basic-offset: 8
|
|
|
|
* End:
|
|
|
|
*/
|