Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 175812
b: refs/heads/master
c: 7fb19ea
h: refs/heads/master
v: v3
  • Loading branch information
Benjamin Herrenschmidt committed Dec 8, 2009
1 parent 0d8665f commit 819527f
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e15a113700324f7fdcee95589875daed2b98a2fe
refs/heads/master: 7fb19ea054a0cdf1a4d935e68d51bde4d3725414
2 changes: 2 additions & 0 deletions trunk/arch/powerpc/include/asm/macio.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ static inline unsigned long macio_resource_len(struct macio_dev *dev, int resour
return res->end - res->start + 1;
}

extern int macio_enable_devres(struct macio_dev *dev);

extern int macio_request_resource(struct macio_dev *dev, int resource_no, const char *name);
extern void macio_release_resource(struct macio_dev *dev, int resource_no);
extern int macio_request_resources(struct macio_dev *dev, const char *name);
Expand Down
47 changes: 47 additions & 0 deletions trunk/drivers/macintosh/macio_asic.c
Original file line number Diff line number Diff line change
Expand Up @@ -538,6 +538,42 @@ void macio_unregister_driver(struct macio_driver *drv)
driver_unregister(&drv->driver);
}

/* Managed MacIO resources */
struct macio_devres {
u32 res_mask;
};

static void maciom_release(struct device *gendev, void *res)
{
struct macio_dev *dev = to_macio_device(gendev);
struct macio_devres *dr = res;
int i, max;

max = min(dev->n_resources, 32);
for (i = 0; i < max; i++) {
if (dr->res_mask & (1 << i))
macio_release_resource(dev, i);
}
}

int macio_enable_devres(struct macio_dev *dev)
{
struct macio_devres *dr;

dr = devres_find(&dev->ofdev.dev, maciom_release, NULL, NULL);
if (!dr) {
dr = devres_alloc(maciom_release, sizeof(*dr), GFP_KERNEL);
if (!dr)
return -ENOMEM;
}
return devres_get(&dev->ofdev.dev, dr, NULL, NULL) != NULL;
}

static struct macio_devres * find_macio_dr(struct macio_dev *dev)
{
return devres_find(&dev->ofdev.dev, maciom_release, NULL, NULL);
}

/**
* macio_request_resource - Request an MMIO resource
* @dev: pointer to the device holding the resource
Expand All @@ -555,13 +591,18 @@ void macio_unregister_driver(struct macio_driver *drv)
int macio_request_resource(struct macio_dev *dev, int resource_no,
const char *name)
{
struct macio_devres *dr = find_macio_dr(dev);

if (macio_resource_len(dev, resource_no) == 0)
return 0;

if (!request_mem_region(macio_resource_start(dev, resource_no),
macio_resource_len(dev, resource_no),
name))
goto err_out;

if (dr && resource_no < 32)
dr->res_mask |= 1 << resource_no;

return 0;

Expand All @@ -582,10 +623,14 @@ int macio_request_resource(struct macio_dev *dev, int resource_no,
*/
void macio_release_resource(struct macio_dev *dev, int resource_no)
{
struct macio_devres *dr = find_macio_dr(dev);

if (macio_resource_len(dev, resource_no) == 0)
return;
release_mem_region(macio_resource_start(dev, resource_no),
macio_resource_len(dev, resource_no));
if (dr && resource_no < 32)
dr->res_mask &= ~(1 << resource_no);
}

/**
Expand Down Expand Up @@ -744,3 +789,5 @@ EXPORT_SYMBOL(macio_request_resource);
EXPORT_SYMBOL(macio_release_resource);
EXPORT_SYMBOL(macio_request_resources);
EXPORT_SYMBOL(macio_release_resources);
EXPORT_SYMBOL(macio_enable_devres);

0 comments on commit 819527f

Please sign in to comment.