regulator: Initialise wm831x structure pointor for ISINK driver
[safe/jmp/linux-2.6] / arch / arm / mach-pxa / magician.c
index d46b367..5360c07 100644 (file)
@@ -25,6 +25,8 @@
 #include <linux/mtd/physmap.h>
 #include <linux/pda_power.h>
 #include <linux/pwm_backlight.h>
+#include <linux/regulator/bq24022.h>
+#include <linux/regulator/machine.h>
 #include <linux/usb/gpio_vbus.h>
 
 #include <mach/hardware.h>
@@ -34,7 +36,7 @@
 #include <mach/pxa27x.h>
 #include <mach/magician.h>
 #include <mach/pxafb.h>
-#include <mach/i2c.h>
+#include <plat/i2c.h>
 #include <mach/mmc.h>
 #include <mach/irda.h>
 #include <mach/ohci.h>
@@ -138,15 +140,9 @@ static unsigned long magician_pin_config[] __initdata = {
  * IRDA
  */
 
-static void magician_irda_transceiver_mode(struct device *dev, int mode)
-{
-       gpio_set_value(GPIO83_MAGICIAN_nIR_EN, mode & IR_OFF);
-       pxa2xx_transceiver_mode(dev, mode);
-}
-
 static struct pxaficp_platform_data magician_ficp_info = {
-       .transceiver_cap  = IR_SIRMODE | IR_OFF,
-       .transceiver_mode = magician_irda_transceiver_mode,
+       .gpio_pwdown            = GPIO83_MAGICIAN_nIR_EN,
+       .transceiver_cap        = IR_SIRMODE | IR_OFF,
 };
 
 /*
@@ -507,7 +503,6 @@ static struct resource pasic3_resources[] = {
 };
 
 static struct pasic3_platform_data pasic3_platform_data = {
-       .bus_shift  = 2,
        .led_pdata  = &pasic3_leds_info,
        .clock_rate = 4000000,
 };
@@ -553,33 +548,7 @@ static struct platform_device gpio_vbus = {
 
 static int power_supply_init(struct device *dev)
 {
-       int ret;
-
-       ret = gpio_request(EGPIO_MAGICIAN_CABLE_STATE_AC, "CABLE_STATE_AC");
-       if (ret)
-               goto err_cs_ac;
-       ret = gpio_request(EGPIO_MAGICIAN_CABLE_STATE_USB, "CABLE_STATE_USB");
-       if (ret)
-               goto err_cs_usb;
-       ret = gpio_request(EGPIO_MAGICIAN_CHARGE_EN, "CHARGE_EN");
-       if (ret)
-               goto err_chg_en;
-       ret = gpio_request(GPIO30_MAGICIAN_nCHARGE_EN, "nCHARGE_EN");
-       if (!ret)
-               ret = gpio_direction_output(GPIO30_MAGICIAN_nCHARGE_EN, 0);
-       if (ret)
-               goto err_nchg_en;
-
-       return 0;
-
-err_nchg_en:
-       gpio_free(EGPIO_MAGICIAN_CHARGE_EN);
-err_chg_en:
-       gpio_free(EGPIO_MAGICIAN_CABLE_STATE_USB);
-err_cs_usb:
-       gpio_free(EGPIO_MAGICIAN_CABLE_STATE_AC);
-err_cs_ac:
-       return ret;
+       return gpio_request(EGPIO_MAGICIAN_CABLE_STATE_AC, "CABLE_STATE_AC");
 }
 
 static int magician_is_ac_online(void)
@@ -587,22 +556,8 @@ static int magician_is_ac_online(void)
        return gpio_get_value(EGPIO_MAGICIAN_CABLE_STATE_AC);
 }
 
-static int magician_is_usb_online(void)
-{
-       return gpio_get_value(EGPIO_MAGICIAN_CABLE_STATE_USB);
-}
-
-static void magician_set_charge(int flags)
-{
-       gpio_set_value(GPIO30_MAGICIAN_nCHARGE_EN, !flags);
-       gpio_set_value(EGPIO_MAGICIAN_CHARGE_EN, flags);
-}
-
 static void power_supply_exit(struct device *dev)
 {
-       gpio_free(GPIO30_MAGICIAN_nCHARGE_EN);
-       gpio_free(EGPIO_MAGICIAN_CHARGE_EN);
-       gpio_free(EGPIO_MAGICIAN_CABLE_STATE_USB);
        gpio_free(EGPIO_MAGICIAN_CABLE_STATE_AC);
 }
 
@@ -613,8 +568,6 @@ static char *magician_supplicants[] = {
 static struct pda_power_pdata power_supply_info = {
        .init            = power_supply_init,
        .is_ac_online    = magician_is_ac_online,
-       .is_usb_online   = magician_is_usb_online,
-       .set_charge      = magician_set_charge,
        .exit            = power_supply_exit,
        .supplied_to     = magician_supplicants,
        .num_supplicants = ARRAY_SIZE(magician_supplicants),
@@ -647,63 +600,69 @@ static struct platform_device power_supply = {
        .num_resources = ARRAY_SIZE(power_supply_resources),
 };
 
-
 /*
- * MMC/SD
+ * Battery charger
  */
 
-static int magician_mci_init(struct device *dev,
-                               irq_handler_t detect_irq, void *data)
-{
-       int err;
-
-       err = request_irq(IRQ_MAGICIAN_SD, detect_irq,
-                               IRQF_DISABLED | IRQF_SAMPLE_RANDOM,
-                               "MMC card detect", data);
-       if (err)
-               goto err_request_irq;
-       err = gpio_request(EGPIO_MAGICIAN_SD_POWER, "SD_POWER");
-       if (err)
-               goto err_request_power;
-       err = gpio_request(EGPIO_MAGICIAN_nSD_READONLY, "nSD_READONLY");
-       if (err)
-               goto err_request_readonly;
+static struct regulator_consumer_supply bq24022_consumers[] = {
+       {
+               .dev = &gpio_vbus.dev,
+               .supply = "vbus_draw",
+       },
+       {
+               .dev = &power_supply.dev,
+               .supply = "ac_draw",
+       },
+};
 
-       return 0;
+static struct regulator_init_data bq24022_init_data = {
+       .constraints = {
+               .max_uA         = 500000,
+               .valid_ops_mask = REGULATOR_CHANGE_CURRENT,
+       },
+       .num_consumer_supplies  = ARRAY_SIZE(bq24022_consumers),
+       .consumer_supplies      = bq24022_consumers,
+};
 
-err_request_readonly:
-       gpio_free(EGPIO_MAGICIAN_SD_POWER);
-err_request_power:
-       free_irq(IRQ_MAGICIAN_SD, data);
-err_request_irq:
-       return err;
-}
+static struct bq24022_mach_info bq24022_info = {
+       .gpio_nce   = GPIO30_MAGICIAN_BQ24022_nCHARGE_EN,
+       .gpio_iset2 = EGPIO_MAGICIAN_BQ24022_ISET2,
+       .init_data  = &bq24022_init_data,
+};
 
-static void magician_mci_setpower(struct device *dev, unsigned int vdd)
-{
-       struct pxamci_platform_data *pdata = dev->platform_data;
+static struct platform_device bq24022 = {
+       .name = "bq24022",
+       .id   = -1,
+       .dev  = {
+               .platform_data = &bq24022_info,
+       },
+};
 
-       gpio_set_value(EGPIO_MAGICIAN_SD_POWER, (1 << vdd) & pdata->ocr_mask);
-}
+/*
+ * MMC/SD
+ */
 
-static int magician_mci_get_ro(struct device *dev)
+static int magician_mci_init(struct device *dev,
+                               irq_handler_t detect_irq, void *data)
 {
-       return (!gpio_get_value(EGPIO_MAGICIAN_nSD_READONLY));
+       return request_irq(IRQ_MAGICIAN_SD, detect_irq,
+                               IRQF_DISABLED | IRQF_SAMPLE_RANDOM,
+                               "mmc card detect", data);
 }
 
 static void magician_mci_exit(struct device *dev, void *data)
 {
-       gpio_free(EGPIO_MAGICIAN_nSD_READONLY);
-       gpio_free(EGPIO_MAGICIAN_SD_POWER);
        free_irq(IRQ_MAGICIAN_SD, data);
 }
 
 static struct pxamci_platform_data magician_mci_info = {
-       .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
-       .init     = magician_mci_init,
-       .get_ro   = magician_mci_get_ro,
-       .setpower = magician_mci_setpower,
-       .exit     = magician_mci_exit,
+       .ocr_mask               = MMC_VDD_32_33|MMC_VDD_33_34,
+       .init                   = magician_mci_init,
+       .exit                   = magician_mci_exit,
+       .gpio_card_detect       = -1,
+       .gpio_card_ro           = EGPIO_MAGICIAN_nSD_READONLY,
+       .gpio_card_ro_invert    = 1,
+       .gpio_power             = EGPIO_MAGICIAN_SD_POWER,
 };
 
 
@@ -749,6 +708,14 @@ static struct platform_device strataflash = {
 };
 
 /*
+ * I2C
+ */
+
+static struct i2c_pxa_platform_data i2c_info = {
+       .fast_mode = 1,
+};
+
+/*
  * Platform devices
  */
 
@@ -757,6 +724,7 @@ static struct platform_device *devices[] __initdata = {
        &egpio,
        &backlight,
        &pasic3,
+       &bq24022,
        &gpio_vbus,
        &power_supply,
        &strataflash,
@@ -774,7 +742,7 @@ static void __init magician_init(void)
 
        pxa2xx_mfp_config(ARRAY_AND_SIZE(magician_pin_config));
 
-       platform_add_devices(devices, ARRAY_SIZE(devices));
+       platform_add_devices(ARRAY_AND_SIZE(devices));
 
        err = gpio_request(GPIO83_MAGICIAN_nIR_EN, "nIR_EN");
        if (!err) {
@@ -782,7 +750,7 @@ static void __init magician_init(void)
                pxa_set_ficp_info(&magician_ficp_info);
        }
        pxa27x_set_i2c_power_info(NULL);
-       pxa_set_i2c_info(NULL);
+       pxa_set_i2c_info(&i2c_info);
        pxa_set_mci_info(&magician_mci_info);
        pxa_set_ohci_info(&magician_ohci_info);