You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'mfd_3.4-1' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6
Pull MFD changes from Samuel Ortiz: - 4 new drivers: Freescale i.MX on-chip Anatop, Ricoh's RC5T583 and TI's TPS65090 and TPS65217. - New variants support (8420, 8520 ab9540), cleanups and bug fixes for the abx500 and db8500 ST-E chipsets. - Some minor fixes and update for the wm8994 from Mark. - The beginning of a long term TWL cleanup effort coming from the TI folks. - Various fixes and cleanups for the s5m, TPS659xx, pm860x, and MAX8997 drivers. Fix up trivial conflicts due to duplicate patches and header file cleanups (<linux/device.h> removal etc). * tag 'mfd_3.4-1' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6: (97 commits) gpio/twl: Add DT support to gpio-twl4030 driver gpio/twl: Allocate irq_desc dynamically for SPARSE_IRQ support mfd: Detach twl6040 from the pmic mfd driver mfd: Replace twl-* pr_ macros by the dev_ equivalent and do various cleanups mfd: Micro-optimization on twl4030 IRQ handler mfd: Make twl4030 SIH SPARSE_IRQ capable mfd: Move twl-core IRQ allocation into twl[4030|6030]-irq files mfd: Remove references already defineid in header file from twl-core mfd: Remove unneeded header from twl-core mfd: Make twl-core not depend on pdata->irq_base/end ARM: OMAP2+: board-omap4-*: Do not use anymore TWL6030_IRQ_BASE in board files mfd: Return twl6030_mmc_card_detect IRQ for board setup Revert "mfd: Add platform data for MAX8997 haptic driver" mfd: Add support for TPS65090 mfd: Add some da9052-i2c section annotations mfd: Build rtc5t583 only if I2C config is selected to y. mfd: Add anatop mfd driver mfd: Fix compilation error in tps65910.h mfd: Add 8420 variant to db8500-prcmu mfd: Add 8520 PRCMU variant to db8500-prcmu ...
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
twl4030 GPIO controller bindings
|
||||
|
||||
Required properties:
|
||||
- compatible:
|
||||
- "ti,twl4030-gpio" for twl4030 GPIO controller
|
||||
- #gpio-cells : Should be two.
|
||||
- first cell is the pin number
|
||||
- second cell is used to specify optional parameters (unused)
|
||||
- gpio-controller : Marks the device node as a GPIO controller.
|
||||
- #interrupt-cells : Should be 2.
|
||||
- interrupt-controller: Mark the device node as an interrupt controller
|
||||
The first cell is the GPIO number.
|
||||
The second cell is not used.
|
||||
|
||||
Example:
|
||||
|
||||
twl_gpio: gpio {
|
||||
compatible = "ti,twl4030-gpio";
|
||||
#gpio-cells = <2>;
|
||||
gpio-controller;
|
||||
#interrupt-cells = <2>;
|
||||
interrupt-controller;
|
||||
};
|
||||
@@ -490,21 +490,22 @@ static struct platform_device omap_vwlan_device = {
|
||||
|
||||
static int omap4_twl6030_hsmmc_late_init(struct device *dev)
|
||||
{
|
||||
int ret = 0;
|
||||
int irq = 0;
|
||||
struct platform_device *pdev = container_of(dev,
|
||||
struct platform_device, dev);
|
||||
struct omap_mmc_platform_data *pdata = dev->platform_data;
|
||||
|
||||
/* Setting MMC1 Card detect Irq */
|
||||
if (pdev->id == 0) {
|
||||
ret = twl6030_mmc_card_detect_config();
|
||||
if (ret)
|
||||
irq = twl6030_mmc_card_detect_config();
|
||||
if (irq < 0) {
|
||||
pr_err("Failed configuring MMC1 card detect\n");
|
||||
pdata->slots[0].card_detect_irq = TWL6030_IRQ_BASE +
|
||||
MMCDETECT_INTR_OFFSET;
|
||||
return irq;
|
||||
}
|
||||
pdata->slots[0].card_detect_irq = irq;
|
||||
pdata->slots[0].card_detect = twl6030_mmc_card_detect;
|
||||
}
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __init void omap4_twl6030_hsmmc_set_late_init(struct device *dev)
|
||||
|
||||
@@ -238,7 +238,7 @@ struct wl12xx_platform_data omap_panda_wlan_data __initdata = {
|
||||
|
||||
static int omap4_twl6030_hsmmc_late_init(struct device *dev)
|
||||
{
|
||||
int ret = 0;
|
||||
int irq = 0;
|
||||
struct platform_device *pdev = container_of(dev,
|
||||
struct platform_device, dev);
|
||||
struct omap_mmc_platform_data *pdata = dev->platform_data;
|
||||
@@ -249,14 +249,15 @@ static int omap4_twl6030_hsmmc_late_init(struct device *dev)
|
||||
}
|
||||
/* Setting MMC1 Card detect Irq */
|
||||
if (pdev->id == 0) {
|
||||
ret = twl6030_mmc_card_detect_config();
|
||||
if (ret)
|
||||
irq = twl6030_mmc_card_detect_config();
|
||||
if (irq < 0) {
|
||||
dev_err(dev, "%s: Error card detect config(%d)\n",
|
||||
__func__, ret);
|
||||
else
|
||||
__func__, irq);
|
||||
return irq;
|
||||
}
|
||||
pdata->slots[0].card_detect = twl6030_mmc_card_detect;
|
||||
}
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __init void omap4_twl6030_hsmmc_set_late_init(struct device *dev)
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
#include <linux/mfd/wm831x/gpio.h>
|
||||
#include <linux/mfd/wm8994/pdata.h>
|
||||
|
||||
#include <linux/regulator/machine.h>
|
||||
|
||||
#include <sound/wm5100.h>
|
||||
#include <sound/wm8996.h>
|
||||
#include <sound/wm8962.h>
|
||||
@@ -153,6 +155,14 @@ static const struct i2c_board_info wm1259_devs[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data wm8994_ldo1 = {
|
||||
.supply_regulator = "WALLVDD",
|
||||
};
|
||||
|
||||
static struct regulator_init_data wm8994_ldo2 = {
|
||||
.supply_regulator = "WALLVDD",
|
||||
};
|
||||
|
||||
static struct wm8994_pdata wm8994_pdata = {
|
||||
.gpio_base = CODEC_GPIO_BASE,
|
||||
.gpio_defaults = {
|
||||
@@ -160,8 +170,8 @@ static struct wm8994_pdata wm8994_pdata = {
|
||||
},
|
||||
.irq_base = CODEC_IRQ_BASE,
|
||||
.ldo = {
|
||||
{ .supply = "WALLVDD" },
|
||||
{ .supply = "WALLVDD" },
|
||||
{ .init_data = &wm8994_ldo1, },
|
||||
{ .init_data = &wm8994_ldo2, },
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
#define MOP500_AB8500_IRQ_BASE IRQ_BOARD_START
|
||||
#define MOP500_AB8500_IRQ_END (MOP500_AB8500_IRQ_BASE \
|
||||
+ AB8500_NR_IRQS)
|
||||
+ AB8500_MAX_NR_IRQS)
|
||||
|
||||
/* TC35892 */
|
||||
#define TC35892_NR_INTERNAL_IRQS 8
|
||||
|
||||
@@ -22,11 +22,11 @@ static struct cpufreq_frequency_table freq_table[] = {
|
||||
},
|
||||
[1] = {
|
||||
.index = 1,
|
||||
.frequency = 300000,
|
||||
.frequency = 400000,
|
||||
},
|
||||
[2] = {
|
||||
.index = 2,
|
||||
.frequency = 600000,
|
||||
.frequency = 800000,
|
||||
},
|
||||
[3] = {
|
||||
/* Used for MAX_OPP, if available */
|
||||
@@ -113,12 +113,9 @@ static int __cpuinit db8500_cpufreq_init(struct cpufreq_policy *policy)
|
||||
|
||||
BUILD_BUG_ON(ARRAY_SIZE(idx2opp) + 1 != ARRAY_SIZE(freq_table));
|
||||
|
||||
if (!prcmu_is_u8400()) {
|
||||
freq_table[1].frequency = 400000;
|
||||
freq_table[2].frequency = 800000;
|
||||
if (prcmu_has_arm_maxopp())
|
||||
freq_table[3].frequency = 1000000;
|
||||
}
|
||||
|
||||
pr_info("db8500-cpufreq : Available frequencies:\n");
|
||||
for (i = 0; freq_table[i].frequency != CPUFREQ_TABLE_END; i++)
|
||||
pr_info(" %d Mhz\n", freq_table[i].frequency/1000);
|
||||
|
||||
@@ -307,13 +307,11 @@ static int __devinit stmpe_gpio_probe(struct platform_device *pdev)
|
||||
struct stmpe_gpio_platform_data *pdata;
|
||||
struct stmpe_gpio *stmpe_gpio;
|
||||
int ret;
|
||||
int irq;
|
||||
int irq = 0;
|
||||
|
||||
pdata = stmpe->pdata->gpio;
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0)
|
||||
return irq;
|
||||
|
||||
stmpe_gpio = kzalloc(sizeof(struct stmpe_gpio), GFP_KERNEL);
|
||||
if (!stmpe_gpio)
|
||||
@@ -330,22 +328,29 @@ static int __devinit stmpe_gpio_probe(struct platform_device *pdev)
|
||||
stmpe_gpio->chip.dev = &pdev->dev;
|
||||
stmpe_gpio->chip.base = pdata ? pdata->gpio_base : -1;
|
||||
|
||||
if (irq >= 0)
|
||||
stmpe_gpio->irq_base = stmpe->irq_base + STMPE_INT_GPIO(0);
|
||||
else
|
||||
dev_info(&pdev->dev,
|
||||
"device configured in no-irq mode; "
|
||||
"irqs are not available\n");
|
||||
|
||||
ret = stmpe_enable(stmpe, STMPE_BLOCK_GPIO);
|
||||
if (ret)
|
||||
goto out_free;
|
||||
|
||||
if (irq >= 0) {
|
||||
ret = stmpe_gpio_irq_init(stmpe_gpio);
|
||||
if (ret)
|
||||
goto out_disable;
|
||||
|
||||
ret = request_threaded_irq(irq, NULL, stmpe_gpio_irq, IRQF_ONESHOT,
|
||||
"stmpe-gpio", stmpe_gpio);
|
||||
ret = request_threaded_irq(irq, NULL, stmpe_gpio_irq,
|
||||
IRQF_ONESHOT, "stmpe-gpio", stmpe_gpio);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "unable to get irq: %d\n", ret);
|
||||
goto out_removeirq;
|
||||
}
|
||||
}
|
||||
|
||||
ret = gpiochip_add(&stmpe_gpio->chip);
|
||||
if (ret) {
|
||||
@@ -361,8 +366,10 @@ static int __devinit stmpe_gpio_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
|
||||
out_freeirq:
|
||||
if (irq >= 0)
|
||||
free_irq(irq, stmpe_gpio);
|
||||
out_removeirq:
|
||||
if (irq >= 0)
|
||||
stmpe_gpio_irq_remove(stmpe_gpio);
|
||||
out_disable:
|
||||
stmpe_disable(stmpe, STMPE_BLOCK_GPIO);
|
||||
@@ -391,8 +398,10 @@ static int __devexit stmpe_gpio_remove(struct platform_device *pdev)
|
||||
|
||||
stmpe_disable(stmpe, STMPE_BLOCK_GPIO);
|
||||
|
||||
if (irq >= 0) {
|
||||
free_irq(irq, stmpe_gpio);
|
||||
stmpe_gpio_irq_remove(stmpe_gpio);
|
||||
}
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
kfree(stmpe_gpio);
|
||||
|
||||
|
||||
+44
-21
@@ -32,6 +32,8 @@
|
||||
#include <linux/irq.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/irqdomain.h>
|
||||
|
||||
#include <linux/i2c/twl.h>
|
||||
|
||||
@@ -256,6 +258,7 @@ static int twl_request(struct gpio_chip *chip, unsigned offset)
|
||||
* and vMMC2 power supplies based on card presence.
|
||||
*/
|
||||
pdata = chip->dev->platform_data;
|
||||
if (pdata)
|
||||
value |= pdata->mmc_cd & 0x03;
|
||||
|
||||
status = gpio_twl4030_write(REG_GPIO_CTRL, value);
|
||||
@@ -395,23 +398,38 @@ static int gpio_twl4030_remove(struct platform_device *pdev);
|
||||
static int __devinit gpio_twl4030_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct twl4030_gpio_platform_data *pdata = pdev->dev.platform_data;
|
||||
int ret;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
int ret, irq_base;
|
||||
|
||||
/* maybe setup IRQs */
|
||||
if (pdata->irq_base) {
|
||||
if (is_module()) {
|
||||
dev_err(&pdev->dev,
|
||||
"can't dispatch IRQs from modules\n");
|
||||
dev_err(&pdev->dev, "can't dispatch IRQs from modules\n");
|
||||
goto no_irqs;
|
||||
}
|
||||
ret = twl4030_sih_setup(TWL4030_MODULE_GPIO);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
WARN_ON(ret != pdata->irq_base);
|
||||
twl4030_gpio_irq_base = ret;
|
||||
|
||||
irq_base = irq_alloc_descs(-1, 0, TWL4030_GPIO_MAX, 0);
|
||||
if (irq_base < 0) {
|
||||
dev_err(&pdev->dev, "Failed to alloc irq_descs\n");
|
||||
return irq_base;
|
||||
}
|
||||
|
||||
irq_domain_add_legacy(node, TWL4030_GPIO_MAX, irq_base, 0,
|
||||
&irq_domain_simple_ops, NULL);
|
||||
|
||||
ret = twl4030_sih_setup(&pdev->dev, TWL4030_MODULE_GPIO, irq_base);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
twl4030_gpio_irq_base = irq_base;
|
||||
|
||||
no_irqs:
|
||||
twl_gpiochip.base = -1;
|
||||
twl_gpiochip.ngpio = TWL4030_GPIO_MAX;
|
||||
twl_gpiochip.dev = &pdev->dev;
|
||||
|
||||
if (pdata) {
|
||||
twl_gpiochip.base = pdata->gpio_base;
|
||||
|
||||
/*
|
||||
* NOTE: boards may waste power if they don't set pullups
|
||||
* and pulldowns correctly ... default for non-ULPI pins is
|
||||
@@ -430,24 +448,20 @@ no_irqs:
|
||||
pdata->debounce, pdata->mmc_cd,
|
||||
ret);
|
||||
|
||||
twl_gpiochip.base = pdata->gpio_base;
|
||||
twl_gpiochip.ngpio = TWL4030_GPIO_MAX;
|
||||
twl_gpiochip.dev = &pdev->dev;
|
||||
|
||||
/* NOTE: we assume VIBRA_CTL.VIBRA_EN, in MODULE_AUDIO_VOICE,
|
||||
/*
|
||||
* NOTE: we assume VIBRA_CTL.VIBRA_EN, in MODULE_AUDIO_VOICE,
|
||||
* is (still) clear if use_leds is set.
|
||||
*/
|
||||
if (pdata->use_leds)
|
||||
twl_gpiochip.ngpio += 2;
|
||||
}
|
||||
|
||||
ret = gpiochip_add(&twl_gpiochip);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev,
|
||||
"could not register gpiochip, %d\n",
|
||||
ret);
|
||||
dev_err(&pdev->dev, "could not register gpiochip, %d\n", ret);
|
||||
twl_gpiochip.ngpio = 0;
|
||||
gpio_twl4030_remove(pdev);
|
||||
} else if (pdata->setup) {
|
||||
} else if (pdata && pdata->setup) {
|
||||
int status;
|
||||
|
||||
status = pdata->setup(&pdev->dev,
|
||||
@@ -465,7 +479,7 @@ static int gpio_twl4030_remove(struct platform_device *pdev)
|
||||
struct twl4030_gpio_platform_data *pdata = pdev->dev.platform_data;
|
||||
int status;
|
||||
|
||||
if (pdata->teardown) {
|
||||
if (pdata && pdata->teardown) {
|
||||
status = pdata->teardown(&pdev->dev,
|
||||
pdata->gpio_base, TWL4030_GPIO_MAX);
|
||||
if (status) {
|
||||
@@ -486,12 +500,21 @@ static int gpio_twl4030_remove(struct platform_device *pdev)
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
static const struct of_device_id twl_gpio_match[] = {
|
||||
{ .compatible = "ti,twl4030-gpio", },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, twl_gpio_match);
|
||||
|
||||
/* Note: this hardware lives inside an I2C-based multi-function device. */
|
||||
MODULE_ALIAS("platform:twl4030_gpio");
|
||||
|
||||
static struct platform_driver gpio_twl4030_driver = {
|
||||
.driver.name = "twl4030_gpio",
|
||||
.driver.owner = THIS_MODULE,
|
||||
.driver = {
|
||||
.name = "twl4030_gpio",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_match_ptr(twl_gpio_match),
|
||||
},
|
||||
.probe = gpio_twl4030_probe,
|
||||
.remove = gpio_twl4030_remove,
|
||||
};
|
||||
|
||||
@@ -59,7 +59,7 @@ static int mc13783_adc_read(struct device *dev,
|
||||
|
||||
ret = mc13xxx_adc_do_conversion(priv->mc13xxx,
|
||||
MC13XXX_ADC_MODE_MULT_CHAN,
|
||||
channel, sample);
|
||||
channel, 0, 0, sample);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
||||
@@ -105,6 +105,8 @@ static int __devinit pm860x_onkey_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, info);
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
|
||||
return 0;
|
||||
|
||||
out_irq:
|
||||
@@ -129,10 +131,34 @@ static int __devexit pm860x_onkey_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int pm860x_onkey_suspend(struct device *dev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent);
|
||||
|
||||
if (device_may_wakeup(dev))
|
||||
chip->wakeup_flag |= 1 << PM8607_IRQ_ONKEY;
|
||||
return 0;
|
||||
}
|
||||
static int pm860x_onkey_resume(struct device *dev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent);
|
||||
|
||||
if (device_may_wakeup(dev))
|
||||
chip->wakeup_flag &= ~(1 << PM8607_IRQ_ONKEY);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(pm860x_onkey_pm_ops, pm860x_onkey_suspend, pm860x_onkey_resume);
|
||||
|
||||
static struct platform_driver pm860x_onkey_driver = {
|
||||
.driver = {
|
||||
.name = "88pm860x-onkey",
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &pm860x_onkey_pm_ops,
|
||||
},
|
||||
.probe = pm860x_onkey_probe,
|
||||
.remove = __devexit_p(pm860x_onkey_remove),
|
||||
|
||||
@@ -39,6 +39,7 @@ struct mc13783_ts_priv {
|
||||
struct delayed_work work;
|
||||
struct workqueue_struct *workq;
|
||||
unsigned int sample[4];
|
||||
struct mc13xxx_ts_platform_data *touch;
|
||||
};
|
||||
|
||||
static irqreturn_t mc13783_ts_handler(int irq, void *data)
|
||||
@@ -125,7 +126,9 @@ static void mc13783_ts_work(struct work_struct *work)
|
||||
unsigned int channel = 12;
|
||||
|
||||
if (mc13xxx_adc_do_conversion(priv->mc13xxx,
|
||||
mode, channel, priv->sample) == 0)
|
||||
mode, channel,
|
||||
priv->touch->ato, priv->touch->atox,
|
||||
priv->sample) == 0)
|
||||
mc13783_ts_report_sample(priv);
|
||||
}
|
||||
|
||||
@@ -179,6 +182,12 @@ static int __init mc13783_ts_probe(struct platform_device *pdev)
|
||||
INIT_DELAYED_WORK(&priv->work, mc13783_ts_work);
|
||||
priv->mc13xxx = dev_get_drvdata(pdev->dev.parent);
|
||||
priv->idev = idev;
|
||||
priv->touch = dev_get_platdata(&pdev->dev);
|
||||
if (!priv->touch) {
|
||||
dev_err(&pdev->dev, "missing platform data\n");
|
||||
ret = -ENODEV;
|
||||
goto err_free_mem;
|
||||
}
|
||||
|
||||
/*
|
||||
* We need separate workqueue because mc13783_adc_do_conversion
|
||||
|
||||
@@ -114,6 +114,27 @@ static inline int __blink_ctl_mask(int port)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int led_power_set(struct pm860x_chip *chip, int port, int on)
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
|
||||
switch (port) {
|
||||
case PM8606_LED1_RED:
|
||||
case PM8606_LED1_GREEN:
|
||||
case PM8606_LED1_BLUE:
|
||||
ret = on ? pm8606_osc_enable(chip, RGB1_ENABLE) :
|
||||
pm8606_osc_disable(chip, RGB1_ENABLE);
|
||||
break;
|
||||
case PM8606_LED2_RED:
|
||||
case PM8606_LED2_GREEN:
|
||||
case PM8606_LED2_BLUE:
|
||||
ret = on ? pm8606_osc_enable(chip, RGB2_ENABLE) :
|
||||
pm8606_osc_disable(chip, RGB2_ENABLE);
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void pm860x_led_work(struct work_struct *work)
|
||||
{
|
||||
|
||||
@@ -126,6 +147,7 @@ static void pm860x_led_work(struct work_struct *work)
|
||||
chip = led->chip;
|
||||
mutex_lock(&led->lock);
|
||||
if ((led->current_brightness == 0) && led->brightness) {
|
||||
led_power_set(chip, led->port, 1);
|
||||
if (led->iset) {
|
||||
pm860x_set_bits(led->i2c, __led_off(led->port),
|
||||
LED_CURRENT_MASK, led->iset);
|
||||
@@ -149,6 +171,7 @@ static void pm860x_led_work(struct work_struct *work)
|
||||
LED_CURRENT_MASK, 0);
|
||||
mask = __blink_ctl_mask(led->port);
|
||||
pm860x_set_bits(led->i2c, PM8606_WLED3B, mask, 0);
|
||||
led_power_set(chip, led->port, 0);
|
||||
}
|
||||
}
|
||||
led->current_brightness = led->brightness;
|
||||
|
||||
+106
-4
@@ -503,6 +503,101 @@ static void device_irq_exit(struct pm860x_chip *chip)
|
||||
free_irq(chip->core_irq, chip);
|
||||
}
|
||||
|
||||
int pm8606_osc_enable(struct pm860x_chip *chip, unsigned short client)
|
||||
{
|
||||
int ret = -EIO;
|
||||
struct i2c_client *i2c = (chip->id == CHIP_PM8606) ?
|
||||
chip->client : chip->companion;
|
||||
|
||||
dev_dbg(chip->dev, "%s(B): client=0x%x\n", __func__, client);
|
||||
dev_dbg(chip->dev, "%s(B): vote=0x%x status=%d\n",
|
||||
__func__, chip->osc_vote,
|
||||
chip->osc_status);
|
||||
|
||||
mutex_lock(&chip->osc_lock);
|
||||
/* Update voting status */
|
||||
chip->osc_vote |= client;
|
||||
/* If reference group is off - turn on*/
|
||||
if (chip->osc_status != PM8606_REF_GP_OSC_ON) {
|
||||
chip->osc_status = PM8606_REF_GP_OSC_UNKNOWN;
|
||||
/* Enable Reference group Vsys */
|
||||
if (pm860x_set_bits(i2c, PM8606_VSYS,
|
||||
PM8606_VSYS_EN, PM8606_VSYS_EN))
|
||||
goto out;
|
||||
|
||||
/*Enable Internal Oscillator */
|
||||
if (pm860x_set_bits(i2c, PM8606_MISC,
|
||||
PM8606_MISC_OSC_EN, PM8606_MISC_OSC_EN))
|
||||
goto out;
|
||||
/* Update status (only if writes succeed) */
|
||||
chip->osc_status = PM8606_REF_GP_OSC_ON;
|
||||
}
|
||||
mutex_unlock(&chip->osc_lock);
|
||||
|
||||
dev_dbg(chip->dev, "%s(A): vote=0x%x status=%d ret=%d\n",
|
||||
__func__, chip->osc_vote,
|
||||
chip->osc_status, ret);
|
||||
return 0;
|
||||
out:
|
||||
mutex_unlock(&chip->osc_lock);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(pm8606_osc_enable);
|
||||
|
||||
int pm8606_osc_disable(struct pm860x_chip *chip, unsigned short client)
|
||||
{
|
||||
int ret = -EIO;
|
||||
struct i2c_client *i2c = (chip->id == CHIP_PM8606) ?
|
||||
chip->client : chip->companion;
|
||||
|
||||
dev_dbg(chip->dev, "%s(B): client=0x%x\n", __func__, client);
|
||||
dev_dbg(chip->dev, "%s(B): vote=0x%x status=%d\n",
|
||||
__func__, chip->osc_vote,
|
||||
chip->osc_status);
|
||||
|
||||
mutex_lock(&chip->osc_lock);
|
||||
/*Update voting status */
|
||||
chip->osc_vote &= ~(client);
|
||||
/* If reference group is off and this is the last client to release
|
||||
* - turn off */
|
||||
if ((chip->osc_status != PM8606_REF_GP_OSC_OFF) &&
|
||||
(chip->osc_vote == REF_GP_NO_CLIENTS)) {
|
||||
chip->osc_status = PM8606_REF_GP_OSC_UNKNOWN;
|
||||
/* Disable Reference group Vsys */
|
||||
if (pm860x_set_bits(i2c, PM8606_VSYS, PM8606_VSYS_EN, 0))
|
||||
goto out;
|
||||
/* Disable Internal Oscillator */
|
||||
if (pm860x_set_bits(i2c, PM8606_MISC, PM8606_MISC_OSC_EN, 0))
|
||||
goto out;
|
||||
chip->osc_status = PM8606_REF_GP_OSC_OFF;
|
||||
}
|
||||
mutex_unlock(&chip->osc_lock);
|
||||
|
||||
dev_dbg(chip->dev, "%s(A): vote=0x%x status=%d ret=%d\n",
|
||||
__func__, chip->osc_vote,
|
||||
chip->osc_status, ret);
|
||||
return 0;
|
||||
out:
|
||||
mutex_unlock(&chip->osc_lock);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(pm8606_osc_disable);
|
||||
|
||||
static void __devinit device_osc_init(struct i2c_client *i2c)
|
||||
{
|
||||
struct pm860x_chip *chip = i2c_get_clientdata(i2c);
|
||||
|
||||
mutex_init(&chip->osc_lock);
|
||||
/* init portofino reference group voting and status */
|
||||
/* Disable Reference group Vsys */
|
||||
pm860x_set_bits(i2c, PM8606_VSYS, PM8606_VSYS_EN, 0);
|
||||
/* Disable Internal Oscillator */
|
||||
pm860x_set_bits(i2c, PM8606_MISC, PM8606_MISC_OSC_EN, 0);
|
||||
|
||||
chip->osc_vote = REF_GP_NO_CLIENTS;
|
||||
chip->osc_status = PM8606_REF_GP_OSC_OFF;
|
||||
}
|
||||
|
||||
static void __devinit device_bk_init(struct pm860x_chip *chip,
|
||||
struct pm860x_platform_data *pdata)
|
||||
{
|
||||
@@ -767,6 +862,15 @@ out:
|
||||
return;
|
||||
}
|
||||
|
||||
static void __devinit device_8606_init(struct pm860x_chip *chip,
|
||||
struct i2c_client *i2c,
|
||||
struct pm860x_platform_data *pdata)
|
||||
{
|
||||
device_osc_init(i2c);
|
||||
device_bk_init(chip, pdata);
|
||||
device_led_init(chip, pdata);
|
||||
}
|
||||
|
||||
int __devinit pm860x_device_init(struct pm860x_chip *chip,
|
||||
struct pm860x_platform_data *pdata)
|
||||
{
|
||||
@@ -774,8 +878,7 @@ int __devinit pm860x_device_init(struct pm860x_chip *chip,
|
||||
|
||||
switch (chip->id) {
|
||||
case CHIP_PM8606:
|
||||
device_bk_init(chip, pdata);
|
||||
device_led_init(chip, pdata);
|
||||
device_8606_init(chip, chip->client, pdata);
|
||||
break;
|
||||
case CHIP_PM8607:
|
||||
device_8607_init(chip, chip->client, pdata);
|
||||
@@ -785,8 +888,7 @@ int __devinit pm860x_device_init(struct pm860x_chip *chip,
|
||||
if (chip->companion) {
|
||||
switch (chip->id) {
|
||||
case CHIP_PM8607:
|
||||
device_bk_init(chip, pdata);
|
||||
device_led_init(chip, pdata);
|
||||
device_8606_init(chip, chip->companion, pdata);
|
||||
break;
|
||||
case CHIP_PM8606:
|
||||
device_8607_init(chip, chip->companion, pdata);
|
||||
|
||||
@@ -334,10 +334,35 @@ static int __devexit pm860x_remove(struct i2c_client *client)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int pm860x_suspend(struct device *dev)
|
||||
{
|
||||
struct i2c_client *client = container_of(dev, struct i2c_client, dev);
|
||||
struct pm860x_chip *chip = i2c_get_clientdata(client);
|
||||
|
||||
if (device_may_wakeup(dev) && chip->wakeup_flag)
|
||||
enable_irq_wake(chip->core_irq);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pm860x_resume(struct device *dev)
|
||||
{
|
||||
struct i2c_client *client = container_of(dev, struct i2c_client, dev);
|
||||
struct pm860x_chip *chip = i2c_get_clientdata(client);
|
||||
|
||||
if (device_may_wakeup(dev) && chip->wakeup_flag)
|
||||
disable_irq_wake(chip->core_irq);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(pm860x_pm_ops, pm860x_suspend, pm860x_resume);
|
||||
|
||||
static struct i2c_driver pm860x_driver = {
|
||||
.driver = {
|
||||
.name = "88PM860x",
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &pm860x_pm_ops,
|
||||
},
|
||||
.probe = pm860x_probe,
|
||||
.remove = __devexit_p(pm860x_remove),
|
||||
|
||||
+52
-2
@@ -143,6 +143,21 @@ config TPS6507X
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called tps6507x.
|
||||
|
||||
config MFD_TPS65217
|
||||
tristate "TPS65217 Power Management / White LED chips"
|
||||
depends on I2C
|
||||
select MFD_CORE
|
||||
select REGMAP_I2C
|
||||
help
|
||||
If you say yes here you get support for the TPS65217 series of
|
||||
Power Management / White LED chips.
|
||||
These include voltage regulators, lithium ion/polymer battery
|
||||
charger, wled and other features that are often used in portable
|
||||
devices.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called tps65217.
|
||||
|
||||
config MFD_TPS6586X
|
||||
bool "TPS6586x Power Management chips"
|
||||
depends on I2C=y && GPIOLIB && GENERIC_HARDIRQS
|
||||
@@ -162,6 +177,7 @@ config MFD_TPS65910
|
||||
depends on I2C=y && GPIOLIB
|
||||
select MFD_CORE
|
||||
select GPIO_TPS65910
|
||||
select REGMAP_I2C
|
||||
help
|
||||
if you say yes here you get support for the TPS65910 series of
|
||||
Power Management chips.
|
||||
@@ -171,7 +187,7 @@ config MFD_TPS65912
|
||||
depends on GPIOLIB
|
||||
|
||||
config MFD_TPS65912_I2C
|
||||
bool "TPS95612 Power Management chip with I2C"
|
||||
bool "TPS65912 Power Management chip with I2C"
|
||||
select MFD_CORE
|
||||
select MFD_TPS65912
|
||||
depends on I2C=y && GPIOLIB
|
||||
@@ -400,7 +416,7 @@ config MFD_MAX8997
|
||||
depends on I2C=y && GENERIC_HARDIRQS
|
||||
select MFD_CORE
|
||||
help
|
||||
Say yes here to support for Maxim Semiconductor MAX8998/8966.
|
||||
Say yes here to support for Maxim Semiconductor MAX8997/8966.
|
||||
This is a Power Management IC with RTC, Flash, Fuel Gauge, Haptic,
|
||||
MUIC controls on chip.
|
||||
This driver provides common support for accessing the device;
|
||||
@@ -812,6 +828,18 @@ config MFD_PM8XXX_IRQ
|
||||
config TPS65911_COMPARATOR
|
||||
tristate
|
||||
|
||||
config MFD_TPS65090
|
||||
bool "TPS65090 Power Management chips"
|
||||
depends on I2C=y && GENERIC_HARDIRQS
|
||||
select MFD_CORE
|
||||
select REGMAP_I2C
|
||||
help
|
||||
If you say yes here you get support for the TPS65090 series of
|
||||
Power Management chips.
|
||||
This driver provides common support for accessing the device,
|
||||
additional drivers must be enabled in order to use the
|
||||
functionality of the device.
|
||||
|
||||
config MFD_AAT2870_CORE
|
||||
bool "Support for the AnalogicTech AAT2870"
|
||||
select MFD_CORE
|
||||
@@ -831,6 +859,28 @@ config MFD_INTEL_MSIC
|
||||
Passage) chip. This chip embeds audio, battery, GPIO, etc.
|
||||
devices used in Intel Medfield platforms.
|
||||
|
||||
config MFD_RC5T583
|
||||
bool "Ricoh RC5T583 Power Management system device"
|
||||
depends on I2C=y && GENERIC_HARDIRQS
|
||||
select MFD_CORE
|
||||
select REGMAP_I2C
|
||||
help
|
||||
Select this option to get support for the RICOH583 Power
|
||||
Management system device.
|
||||
This driver provides common support for accessing the device
|
||||
through i2c interface. The device supports multiple sub-devices
|
||||
like GPIO, interrupts, RTC, LDO and DCDC regulators, onkey.
|
||||
Additional drivers must be enabled in order to use the
|
||||
different functionality of the device.
|
||||
|
||||
config MFD_ANATOP
|
||||
bool "Support for Freescale i.MX on-chip ANATOP controller"
|
||||
depends on SOC_IMX6Q
|
||||
help
|
||||
Select this option to enable Freescale i.MX on-chip ANATOP
|
||||
MFD controller. This controller embeds regulator and
|
||||
thermal devices for Freescale i.MX platforms.
|
||||
|
||||
endmenu
|
||||
endif
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ obj-$(CONFIG_MFD_WM8994) += wm8994-core.o wm8994-irq.o wm8994-regmap.o
|
||||
obj-$(CONFIG_TPS6105X) += tps6105x.o
|
||||
obj-$(CONFIG_TPS65010) += tps65010.o
|
||||
obj-$(CONFIG_TPS6507X) += tps6507x.o
|
||||
obj-$(CONFIG_MFD_TPS65217) += tps65217.o
|
||||
obj-$(CONFIG_MFD_TPS65910) += tps65910.o tps65910-irq.o
|
||||
tps65912-objs := tps65912-core.o tps65912-irq.o
|
||||
obj-$(CONFIG_MFD_TPS65912) += tps65912.o
|
||||
@@ -109,6 +110,9 @@ obj-$(CONFIG_MFD_OMAP_USB_HOST) += omap-usb-host.o
|
||||
obj-$(CONFIG_MFD_PM8921_CORE) += pm8921-core.o
|
||||
obj-$(CONFIG_MFD_PM8XXX_IRQ) += pm8xxx-irq.o
|
||||
obj-$(CONFIG_TPS65911_COMPARATOR) += tps65911-comparator.o
|
||||
obj-$(CONFIG_MFD_TPS65090) += tps65090.o
|
||||
obj-$(CONFIG_MFD_AAT2870_CORE) += aat2870-core.o
|
||||
obj-$(CONFIG_MFD_INTEL_MSIC) += intel_msic.o
|
||||
obj-$(CONFIG_MFD_RC5T583) += rc5t583.o rc5t583-irq.o
|
||||
obj-$(CONFIG_MFD_S5M_CORE) += s5m-core.o s5m-irq.o
|
||||
obj-$(CONFIG_MFD_ANATOP) += anatop-mfd.o
|
||||
|
||||
+270
-75
File diff suppressed because it is too large
Load Diff
@@ -11,7 +11,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mfd/abx500/ab8500.h>
|
||||
#include <linux/mfd/db8500-prcmu.h>
|
||||
#include <linux/mfd/dbx500-prcmu.h>
|
||||
|
||||
static int ab8500_i2c_write(struct ab8500 *ab8500, u16 addr, u8 data)
|
||||
{
|
||||
@@ -23,6 +23,18 @@ static int ab8500_i2c_write(struct ab8500 *ab8500, u16 addr, u8 data)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ab8500_i2c_write_masked(struct ab8500 *ab8500, u16 addr, u8 mask,
|
||||
u8 data)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = prcmu_abb_write_masked((u8)(addr >> 8), (u8)(addr & 0xFF), &data,
|
||||
&mask, 1);
|
||||
if (ret < 0)
|
||||
dev_err(ab8500->dev, "prcmu i2c error %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ab8500_i2c_read(struct ab8500 *ab8500, u16 addr)
|
||||
{
|
||||
int ret;
|
||||
@@ -38,6 +50,7 @@ static int ab8500_i2c_read(struct ab8500 *ab8500, u16 addr)
|
||||
|
||||
static int __devinit ab8500_i2c_probe(struct platform_device *plf)
|
||||
{
|
||||
const struct platform_device_id *platid = platform_get_device_id(plf);
|
||||
struct ab8500 *ab8500;
|
||||
struct resource *resource;
|
||||
int ret;
|
||||
@@ -58,13 +71,15 @@ static int __devinit ab8500_i2c_probe(struct platform_device *plf)
|
||||
|
||||
ab8500->read = ab8500_i2c_read;
|
||||
ab8500->write = ab8500_i2c_write;
|
||||
ab8500->write_masked = ab8500_i2c_write_masked;
|
||||
|
||||
platform_set_drvdata(plf, ab8500);
|
||||
|
||||
ret = ab8500_init(ab8500);
|
||||
ret = ab8500_init(ab8500, platid->driver_data);
|
||||
if (ret)
|
||||
kfree(ab8500);
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -78,13 +93,22 @@ static int __devexit ab8500_i2c_remove(struct platform_device *plf)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct platform_device_id ab8500_id[] = {
|
||||
{ "ab8500-i2c", AB8500_VERSION_AB8500 },
|
||||
{ "ab8505-i2c", AB8500_VERSION_AB8505 },
|
||||
{ "ab9540-i2c", AB8500_VERSION_AB9540 },
|
||||
{ "ab8540-i2c", AB8500_VERSION_AB8540 },
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct platform_driver ab8500_i2c_driver = {
|
||||
.driver = {
|
||||
.name = "ab8500-i2c",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = ab8500_i2c_probe,
|
||||
.remove = __devexit_p(ab8500_i2c_remove)
|
||||
.remove = __devexit_p(ab8500_i2c_remove),
|
||||
.id_table = ab8500_id,
|
||||
};
|
||||
|
||||
static int __init ab8500_i2c_init(void)
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
/*
|
||||
* Anatop MFD driver
|
||||
*
|
||||
* Copyright (C) 2012 Ying-Chun Liu (PaulLiu) <paul.liu@linaro.org>
|
||||
* Copyright (C) 2012 Linaro
|
||||
*
|
||||
* 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.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
* 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.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/mfd/anatop.h>
|
||||
|
||||
u32 anatop_get_bits(struct anatop *adata, u32 addr, int bit_shift,
|
||||
int bit_width)
|
||||
{
|
||||
u32 val, mask;
|
||||
|
||||
if (bit_width == 32)
|
||||
mask = ~0;
|
||||
else
|
||||
mask = (1 << bit_width) - 1;
|
||||
|
||||
val = readl(adata->ioreg + addr);
|
||||
val = (val >> bit_shift) & mask;
|
||||
|
||||
return val;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(anatop_get_bits);
|
||||
|
||||
void anatop_set_bits(struct anatop *adata, u32 addr, int bit_shift,
|
||||
int bit_width, u32 data)
|
||||
{
|
||||
u32 val, mask;
|
||||
|
||||
if (bit_width == 32)
|
||||
mask = ~0;
|
||||
else
|
||||
mask = (1 << bit_width) - 1;
|
||||
|
||||
spin_lock(&adata->reglock);
|
||||
val = readl(adata->ioreg + addr) & ~(mask << bit_shift);
|
||||
writel((data << bit_shift) | val, adata->ioreg + addr);
|
||||
spin_unlock(&adata->reglock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(anatop_set_bits);
|
||||
|
||||
static const struct of_device_id of_anatop_match[] = {
|
||||
{ .compatible = "fsl,imx6q-anatop", },
|
||||
{ },
|
||||
};
|
||||
|
||||
static int __devinit of_anatop_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device_node *np = dev->of_node;
|
||||
void *ioreg;
|
||||
struct anatop *drvdata;
|
||||
|
||||
ioreg = of_iomap(np, 0);
|
||||
if (!ioreg)
|
||||
return -EADDRNOTAVAIL;
|
||||
drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
|
||||
if (!drvdata)
|
||||
return -ENOMEM;
|
||||
drvdata->ioreg = ioreg;
|
||||
spin_lock_init(&drvdata->reglock);
|
||||
platform_set_drvdata(pdev, drvdata);
|
||||
of_platform_populate(np, of_anatop_match, NULL, dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devexit of_anatop_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct anatop *drvdata;
|
||||
drvdata = platform_get_drvdata(pdev);
|
||||
iounmap(drvdata->ioreg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver anatop_of_driver = {
|
||||
.driver = {
|
||||
.name = "anatop-mfd",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_anatop_match,
|
||||
},
|
||||
.probe = of_anatop_probe,
|
||||
.remove = of_anatop_remove,
|
||||
};
|
||||
|
||||
static int __init anatop_init(void)
|
||||
{
|
||||
return platform_driver_register(&anatop_of_driver);
|
||||
}
|
||||
postcore_initcall(anatop_init);
|
||||
|
||||
static void __exit anatop_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&anatop_of_driver);
|
||||
}
|
||||
module_exit(anatop_exit);
|
||||
|
||||
MODULE_AUTHOR("Ying-Chun Liu (PaulLiu) <paul.liu@linaro.org>");
|
||||
MODULE_DESCRIPTION("ANATOP MFD driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
@@ -525,6 +525,11 @@ static void asic3_gpio_set(struct gpio_chip *chip,
|
||||
return;
|
||||
}
|
||||
|
||||
static int asic3_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
return (offset < ASIC3_NUM_GPIOS) ? IRQ_BOARD_START + offset : -ENXIO;
|
||||
}
|
||||
|
||||
static __init int asic3_gpio_probe(struct platform_device *pdev,
|
||||
u16 *gpio_config, int num)
|
||||
{
|
||||
@@ -976,6 +981,7 @@ static int __init asic3_probe(struct platform_device *pdev)
|
||||
asic->gpio.set = asic3_gpio_set;
|
||||
asic->gpio.direction_input = asic3_gpio_direction_input;
|
||||
asic->gpio.direction_output = asic3_gpio_direction_output;
|
||||
asic->gpio.to_irq = asic3_gpio_to_irq;
|
||||
|
||||
ret = asic3_gpio_probe(pdev,
|
||||
pdata->gpio_config,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user