-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 105135 b: refs/heads/master c: aa613de h: refs/heads/master i: 105133: 0cb4caa 105131: 5725978 105127: 3f8ccb5 105119: 1b21951 v: v3
- Loading branch information
Dmitry Baryshkov
authored and
Russell King
committed
Jul 7, 2008
1 parent
fbad7be
commit 221dab0
Showing
5 changed files
with
176 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 53b14ea336ca45f34821ad78a1b45c2315283621 | ||
refs/heads/master: aa613de676986f136fa6f48a4d709b5d264f4f38 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
/* | ||
* drivers/mfd/mfd-core.c | ||
* | ||
* core MFD support | ||
* Copyright (c) 2006 Ian Molton | ||
* Copyright (c) 2007,2008 Dmitry Baryshkov | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
* | ||
*/ | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/platform_device.h> | ||
#include <linux/mfd/core.h> | ||
|
||
static int mfd_add_device(struct platform_device *parent, | ||
const struct mfd_cell *cell, | ||
struct resource *mem_base, | ||
int irq_base) | ||
{ | ||
struct resource res[cell->num_resources]; | ||
struct platform_device *pdev; | ||
int ret = -ENOMEM; | ||
int r; | ||
|
||
pdev = platform_device_alloc(cell->name, parent->id); | ||
if (!pdev) | ||
goto fail_alloc; | ||
|
||
pdev->dev.parent = &parent->dev; | ||
|
||
ret = platform_device_add_data(pdev, | ||
cell, sizeof(struct mfd_cell)); | ||
if (ret) | ||
goto fail_device; | ||
|
||
memzero(res, sizeof(res)); | ||
for (r = 0; r < cell->num_resources; r++) { | ||
res[r].name = cell->resources[r].name; | ||
res[r].flags = cell->resources[r].flags; | ||
|
||
/* Find out base to use */ | ||
if (cell->resources[r].flags & IORESOURCE_MEM) { | ||
res[r].parent = mem_base; | ||
res[r].start = mem_base->start + | ||
cell->resources[r].start; | ||
res[r].end = mem_base->start + | ||
cell->resources[r].end; | ||
} else if (cell->resources[r].flags & IORESOURCE_IRQ) { | ||
res[r].start = irq_base + | ||
cell->resources[r].start; | ||
res[r].end = irq_base + | ||
cell->resources[r].end; | ||
} else { | ||
res[r].parent = cell->resources[r].parent; | ||
res[r].start = cell->resources[r].start; | ||
res[r].end = cell->resources[r].end; | ||
} | ||
} | ||
|
||
platform_device_add_resources(pdev, res, cell->num_resources); | ||
|
||
ret = platform_device_add(pdev); | ||
if (ret) | ||
goto fail_device; | ||
|
||
return 0; | ||
|
||
/* platform_device_del(pdev); */ | ||
fail_device: | ||
platform_device_put(pdev); | ||
fail_alloc: | ||
return ret; | ||
} | ||
|
||
int mfd_add_devices( | ||
struct platform_device *parent, | ||
const struct mfd_cell *cells, int n_devs, | ||
struct resource *mem_base, | ||
int irq_base) | ||
{ | ||
int i; | ||
int ret = 0; | ||
|
||
for (i = 0; i < n_devs; i++) { | ||
ret = mfd_add_device(parent, cells + i, mem_base, irq_base); | ||
if (ret) | ||
break; | ||
} | ||
|
||
if (ret) | ||
mfd_remove_devices(parent); | ||
|
||
return ret; | ||
} | ||
EXPORT_SYMBOL(mfd_add_devices); | ||
|
||
static int mfd_remove_devices_fn(struct device *dev, void *unused) | ||
{ | ||
platform_device_unregister( | ||
container_of(dev, struct platform_device, dev)); | ||
return 0; | ||
} | ||
|
||
void mfd_remove_devices(struct platform_device *parent) | ||
{ | ||
device_for_each_child(&parent->dev, NULL, mfd_remove_devices_fn); | ||
} | ||
EXPORT_SYMBOL(mfd_remove_devices); | ||
|
||
MODULE_LICENSE("GPL"); | ||
MODULE_AUTHOR("Ian Molton, Dmitry Baryshkov"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
#ifndef MFD_CORE_H | ||
#define MFD_CORE_H | ||
/* | ||
* drivers/mfd/mfd-core.h | ||
* | ||
* core MFD support | ||
* Copyright (c) 2006 Ian Molton | ||
* Copyright (c) 2007 Dmitry Baryshkov | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
* | ||
*/ | ||
|
||
#include <linux/platform_device.h> | ||
|
||
/* | ||
* This struct describes the MFD part ("cell"). | ||
* After registration the copy of this structure will become the platform data | ||
* of the resulting platform_device | ||
*/ | ||
struct mfd_cell { | ||
const char *name; | ||
|
||
int (*enable)(struct platform_device *dev); | ||
int (*disable)(struct platform_device *dev); | ||
int (*suspend)(struct platform_device *dev); | ||
int (*resume)(struct platform_device *dev); | ||
|
||
void *driver_data; /* driver-specific data */ | ||
|
||
/* | ||
* This resources can be specified relatievly to the parent device. | ||
* For accessing device you should use resources from device | ||
*/ | ||
int num_resources; | ||
const struct resource *resources; | ||
}; | ||
|
||
static inline struct mfd_cell * | ||
mfd_get_cell(struct platform_device *pdev) | ||
{ | ||
return (struct mfd_cell *)pdev->dev.platform_data; | ||
} | ||
|
||
extern int mfd_add_devices( | ||
struct platform_device *parent, | ||
const struct mfd_cell *cells, int n_devs, | ||
struct resource *mem_base, | ||
int irq_base); | ||
|
||
extern void mfd_remove_devices(struct platform_device *parent); | ||
|
||
#endif |