1:fix compile warning 2:add aon set magic
author钦峰 <xiaojin.cxj@alibaba-inc.com>
Tue, 19 Mar 2024 06:39:48 +0000 (14:39 +0800)
committerHan Gao <rabenda.cn@gmail.com>
Wed, 29 May 2024 08:21:44 +0000 (16:21 +0800)
Change-Id: I511dc51ff71ae9567dcc0b6b91f6bcac1ae61f3b

arch/riscv/dts/light-a-val.dts
arch/riscv/dts/light-b-product.dts
arch/riscv/dts/light-lpi4a.dts
board/thead/light-c910/board.c
board/thead/light-c910/light.c
board/thead/light-c910/lpddr4/include/ddr_retention.h
board/thead/light-c910/lpddr4/src/ddr_retention.c
board/thead/light-c910/spl.c
drivers/misc/light_regu.c
drivers/misc/light_regu.h

index a90a49171cf3b4a1e5d83ed742131ea7c8dbf2b3..87db40a92fd474c5494f50d947af57a9b70a2b88 100644 (file)
                        compatible = "thead,light-dialog-pmic";
                        status = "okay";
 
-
-
                        soc_dvdd18_aon_reg: soc_dvdd18_aon {
                                regulator-name = "soc_dvdd18_aon";
                                regulator-boot-on;
                        status = "okay";
                        #address-cells = <1>;
                        #size-cells = <0>;
+                       iic-config = <0 0 2>;
                        pmic_dev_0: pmic-dev@0 {
                          pmic-name = "dialog,da9063,v1";
                          pmic-addr = <0x5a 0x5b>;
index a932f5c9c86be2baaebf6ceed8f879d7cd17afa3..cfd7dd97d1d6e5c431fb9c33ad52cb6527e637c3 100644 (file)
                        compatible = "thead,light-pmic-conf";
                        status = "okay";
                        #address-cells = <1>;
-                       #size-cells = <0>;
-
+                   #size-cells = <0>;
+                       iic-config = <0 0 2>;
                        pmic_dev_0: pmic-dev@0 {
                          pmic-name = "ricoh,rn5t567,v0";
                          pmic-addr = <0x31>;
index e252b462fcb36b1f69407cdb67bfc5797efb77cf..485ead7e97b3e6aabdfa3508b873b82d15d7b6ad 100644 (file)
 
                        #address-cells = <1>;
                        #size-cells = <0>;
-
+                       iic-config = <0 0 2>;
                        pmic_dev_0: pmic-dev@0 {
                          pmic-name = "dialog,da9063,v1";
                          pmic-addr = <0x5a 0x5b>;
index 91fd9e58d222b140671f66d3993cd025faaa6fec..a5fa1cabb5dd83aca2398649dad853cfeeac632f 100644 (file)
@@ -17,6 +17,7 @@
 #ifdef CONFIG_LIGHT_AON_CONF
 #include "../../../drivers/misc/light_regu.h"
 #include "dm/device.h"
+#include "dm/uclass.h"
 #endif
 
 #ifdef CONFIG_USB_DWC3
@@ -141,7 +142,7 @@ void boot_audio(void)
 
 #ifdef CONFIG_LIGHT_AON_CONF
 
-int get_and_set_aon_config_data()
+int get_and_set_aon_config_data(void)
 {
        int ret =0;
     struct udevice *dev;
@@ -156,12 +157,12 @@ int get_and_set_aon_config_data()
        config_data = (struct mic_regu_platdata *)(dev->platdata);
 
     volatile aon_config_t* read_config = (aon_config_t* )C910_E902_START_ADDRESS;
-       if(strncmp(read_config->magic , AON_CONFIG_MAGIC, strlen(AON_CONFIG_MAGIC))) {
+       if(strncmp((const char*)read_config->magic , AON_CONFIG_MAGIC, strlen(AON_CONFIG_MAGIC))) {
         printf("No aon config magic found in aon bin, please check the aon bin\n");
                return -1;
        }
 
-       if(strncmp(read_config->version, AON_CONFIG_VERSION, strlen(AON_CONFIG_VERSION))) {
+       if(strncmp((const char*)read_config->version, AON_CONFIG_VERSION, strlen(AON_CONFIG_VERSION))) {
        printf("Err aon config version, aon bin is:%s, u-boot is:%s\n", read_config->version, AON_CONFIG_VERSION);
           return -1;
        }
@@ -174,25 +175,28 @@ int get_and_set_aon_config_data()
        /*set pmic dev info */
        int pmic_dev_num =  config_data->pmic_list.pmic_num;
     int pmic_dev_list_offset   = sizeof(aon_config_t);
-       uintptr_t pmic_dev_start_addr  =  C910_E902_START_ADDRESS + pmic_dev_list_offset;
+       uint64_t pmic_dev_start_addr  =  C910_E902_START_ADDRESS + pmic_dev_list_offset;
 
        int  regu_num            = config_data->regu_id_list.regu_id_num;
        int  regu_id_list_offset = pmic_dev_list_offset + pmic_dev_num * sizeof(pmic_dev_info_t);
-       uintptr_t regu_start_addr  = C910_E902_START_ADDRESS + regu_id_list_offset;
+       uint64_t regu_start_addr  = C910_E902_START_ADDRESS + regu_id_list_offset;
     int aon_bin_size  =  regu_id_list_offset + regu_num* sizeof(csi_regu_id_t);
     if( aon_bin_size > read_config->aon_config_partition_size) {
-         printf("Invalid aon partition size, aon bin support:%d, u-boot is %d\n", read_config->aon_config_partition_size, aon_bin_size);
+         printf("Invalid aon partition size, aon bin support:%lld, u-boot is %d\n", read_config->aon_config_partition_size, aon_bin_size);
                 return -1;
        }
 
-       printf("pmic_dev_num:%d offset:%d addr:0x%10x\n",pmic_dev_num, pmic_dev_list_offset, pmic_dev_start_addr);
+       printf("pmic_dev_num:%d offset:%d addr:%lld\n",pmic_dev_num, pmic_dev_list_offset, pmic_dev_start_addr);
 
-       memcpy(pmic_dev_start_addr, config_data->pmic_list.pmic_list, pmic_dev_num * sizeof(pmic_dev_info_t));
-    printf("regu_num:%d offset:%d addr:0x%10x\n",regu_num,regu_id_list_offset, regu_start_addr);
+       memcpy((void*)pmic_dev_start_addr, config_data->pmic_list.pmic_list, pmic_dev_num * sizeof(pmic_dev_info_t));
+    printf("regu_num:%d offset:%d addr:%lld\n",regu_num,regu_id_list_offset, regu_start_addr);
 
-       memcpy(regu_start_addr, config_data->regu_id_list.regu_id_list, regu_num * sizeof(csi_regu_id_t));
+       memcpy((void*)regu_start_addr, config_data->regu_id_list.regu_id_list, regu_num * sizeof(csi_regu_id_t));
     
        read_config->wakeup_flag = config_data->wakeup_flag;
+       read_config->aon_pmic.iic_config.iic_id = config_data->iic_config.iic_id;
+       read_config->aon_pmic.iic_config.addr_mode = config_data->iic_config.addr_mode;
+       read_config->aon_pmic.iic_config.speed  = config_data->iic_config.speed;
        read_config->aon_pmic.pmic_dev_num =  pmic_dev_num;
     read_config->aon_pmic.pmic_dev_list_offset   = pmic_dev_list_offset;
 
@@ -200,11 +204,12 @@ int get_and_set_aon_config_data()
        read_config->aon_pmic.regu_num =  regu_num;
        read_config->aon_pmic.regu_id_list_offset = regu_id_list_offset;
 
+       memcpy((void*)read_config->uboot_set_magic, UBOOT_CONFIG_MAGIC, strlen(UBOOT_CONFIG_MAGIC));
+
     flush_cache((uintptr_t)C910_E902_START_ADDRESS, aon_bin_size);
 
        printf("-->pmic_dev_num:%d offset:%d\n",read_config->aon_pmic.pmic_dev_num, read_config->aon_pmic.pmic_dev_list_offset);
        printf("-->regu_num:%d offset:%d\n",read_config->aon_pmic.regu_num,read_config->aon_pmic.regu_id_list_offset);
-
        return 0;
 }
 #endif
index 853950261e3a935798e30adc752d4dd28a3c83d6..c777ad987e5ff616e3dc405daabb54d6a97b1a40 100644 (file)
@@ -1476,7 +1476,6 @@ static void light_iopin_init(void)
        light_pin_cfg(AUDIO_PA29, PIN_SPEED_NORMAL, PIN_PN, 2);
        light_pin_mux(AUDIO_PA30, 0);
        light_pin_cfg(AUDIO_PA30, PIN_SPEED_NORMAL, PIN_PN, 2);
-       #warning "aon set to 3"
        light_pin_mux(AUDIO_PA30, 3);
 
        // light_pin_mux(AUDIO_PA9,3);                         ///AUDIO-PA-RESET
index 0268bd381e49479a3fd0c37d4b1de9bd0d74af1e..42eb034f6b94996fc83036a93c67f30d80236397 100644 (file)
@@ -31,5 +31,6 @@ typedef struct Ddr_Reg_Config {
 } Ddr_Reg_Config_t;
 
 int dwc_ddrphy_phyinit_regInterface(regInstr myRegInstr);
+void dwc_ddr_misc_regu_save(void);
 
 #endif
index fb628369972e79bb8323914db03c45258edb4e44..eed83aac6b440eac691b25df31ad33ccf8f22040 100644 (file)
@@ -988,9 +988,8 @@ static const uint32_t RetRegList_addr[934] =
     0x13840,
 };
 
-void dwc_ddr_misc_regu_save()
+void dwc_ddr_misc_regu_save(void)
 {
-    uint32_t data =  0;
     ddr_Regu_Config->misc_reg_num =  ARRAY_SIZE(MiscRegList);
     Reg_Misc_Addr_Val_t* misc_addr_t =  (Reg_Misc_Addr_Val_t*)((char*)ddr_Regu_Config +  64);
     for(int i = 0; i < ddr_Regu_Config->misc_reg_num; i++) {
index 7d9fa418d09376b12aaa81ac3a7b28bbcfaf1b21..6358a930934b7e4cca72103e26b9051cd0832e39 100644 (file)
@@ -377,7 +377,6 @@ int boundary_verify(unsigned long boundary) {
 
 int setup_ddr_addrmap(void)
 {
-       int ret;
        unsigned long boundary = (unsigned long)MAXIMAL_DDR_DENSITY_MB * UNIT_MB;
 
        // verify data accessing result firstly
index 7d93a583f64804a02c3677bb5672c004066a4bdc..1137692901d85cd5969824acdb4e78e463b6480e 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/delay.h>
 #include <command.h>
 #include "light_regu.h"
+#include <dm/device.h>
 
 #define FDT32_TO_CPU(x) (fdt32_to_cpu(x))
 
@@ -18,7 +19,7 @@
 #endif
 
 #ifdef AON_CONF_DEBUG
-#define AON_CONF_D(fmt, args...)  printf(fmt,##args)
+#define AON_CONF_D(fmt, args...) printf(fmt, ##args)
 #else
 #define AON_CONF_D(fmt, args...)
 #endif
@@ -69,7 +70,7 @@ static int misc_regu_remove(struct udevice *dev)
        return 0;
 }
 
-static soc_virtual_id_t *found_base_virtual_id(char *name)
+static soc_virtual_id_t *found_base_virtual_id(const char *name)
 {
        for (int i = 0; i < ARRAY_SIZE(soc_base_virtual_id_list); i++)
        {
@@ -111,7 +112,7 @@ static int misc_regu_get_virtual_regu_config(struct udevice *dev, ofnode parent_
        soc_virtual_id_t *soc_base_id;
        ofnode_for_each_subnode(child_node, parent_node)
        {
-               //printf("sub node name: %s\n", ofnode_get_name(child_node));
+               // printf("sub node name: %s\n", ofnode_get_name(child_node));
                regu_num++;
        }
 
@@ -134,8 +135,8 @@ static int misc_regu_get_virtual_regu_config(struct udevice *dev, ofnode parent_
        ofnode_for_each_subnode(child_node, parent_node)
        {
                const char *virtual_id_name = ofnode_get_name(child_node);
-               int min_uv;
-               int max_uv;
+           uint32_t min_uv;
+               uint32_t max_uv;
                soc_base_id = found_base_virtual_id(virtual_id_name);
                if (soc_base_id)
                {
@@ -173,7 +174,11 @@ static int misc_regu_get_virtual_regu_config(struct udevice *dev, ofnode parent_
                {
                        id_list[index].max_uv = max_uv;
                }
-#warning "check double"
+               if (id_list[index].max_uv < id_list[index].min_uv)
+               {
+                       printf("id:%d regulator-max-microvolt:%d is smaller than regulator-min-microvolt:%d\n", index, id_list[index].max_uv, id_list[index].min_uv);
+                       return -1;
+               }
                // printf("Get virtual regu_id:[%d]:%s min_uv:%dmv max_uv:%dmv\n", id_list[index].id, id_list[index].virtual_id_name,
                //         id_list[index].min_uv, id_list[index].max_uv);
                index++;
@@ -185,12 +190,12 @@ static int misc_regu_get_virtual_regu_config(struct udevice *dev, ofnode parent_
        return 0;
 }
 
-static int misc_grep_pmic_dev_name_info(char *dev_name, pmic_dev_info_t *dev)
+static int misc_grep_pmic_dev_name_info(const char *dev_name, pmic_dev_info_t *dev)
 {
        int flag_num = 0;
        int version_flag = 0;
        int index = 0;
-       char *dev_name_orig = dev_name;
+       const char *dev_name_orig = dev_name;
        while (*dev_name)
        {
                if (*dev_name == ',')
@@ -235,20 +240,117 @@ static int get_node_index(const char *name)
        return strtoul(name, NULL, 10);
 }
 
+static int misc_pmic_parent_io_ctrl_config(ofnode dev_node, pmic_parent_ctrl_info_t *ctrl_info)
+{
+       ofnode parent_ctrl_sub_node, parent_pmic_node;
+       int get_aon_ctrl_info_flag = 0;
+       int get_pmic_pin_ctrl_info_flag = 0;
+       uint32_t prop_size;
+       int prop_len;
+       const uint32_t *prop_val;
+
+       ofnode_for_each_subnode(parent_ctrl_sub_node, dev_node)
+       {
+               const char *node_name = ofnode_get_name(parent_ctrl_sub_node);
+               if (!strncmp(node_name, PMIC_PARENT_CTRL_NAME, strlen(PMIC_PARENT_CTRL_NAME)))
+               {
+                       if (ofnode_read_bool(parent_ctrl_sub_node, "aon_pin_ctrl_info"))
+                       {
+                               prop_val = ofnode_get_property(parent_ctrl_sub_node, "aon_pin_ctrl_info", &prop_len);
+                               if (!prop_val)
+                               {
+                                       printf("aon_pin_ctrl_info property not found\n");
+                                       return -1;
+                               }
+                               prop_size = prop_len / sizeof(uint32_t);
+                               if (prop_size != 3)
+                               {
+                                       printf("invalid pmic-aon_pin_ctrl_info cell size %d, it should set format as aon_pin_ctrl_info = <<port> <pin> <activate_status>>\n", prop_size);
+                                       return -1;
+                               }
+                               ctrl_info->pmic_ctrl_type = PMIC_CTRL_BY_AON_GPIO;
+                               ctrl_info->info.aon_io.gpio_port = FDT32_TO_CPU(prop_val[0]);
+                               ctrl_info->info.aon_io.pin = FDT32_TO_CPU(prop_val[1]);
+                               ctrl_info->info.aon_io.activate_status = FDT32_TO_CPU(prop_val[2]);
+                               if (ctrl_info->info.aon_io.activate_status != HW_ID_ACTIVATE_HIGH && ctrl_info->info.aon_io.activate_status != HW_ID_ACTIVATE_LOW)
+                               {
+                                       printf("aon io activate should set to: ACTIVATE_HIGH:0 or ACTIVATE_LOW:1");
+                                       return -1;
+                               }
+                               get_aon_ctrl_info_flag = 1;
+                       }
+
+                       if (ofnode_read_bool(parent_ctrl_sub_node, "pmic_pin_ctrl_info"))
+                       {
+                               prop_val = ofnode_get_property(parent_ctrl_sub_node, "pmic_pin_ctrl_info", &prop_len);
+                               if (!prop_val)
+                               {
+                                       printf("pmic_pin_ctrl_info property not found\n");
+                                       return -1;
+                               }
+                               prop_size = prop_len / sizeof(uint32_t);
+                               if (prop_size != 3)
+                               {
+                                       printf("invalid pmic-pmic_pin_ctrl_info cell size %d, it should set format as pmic_pin_ctrl_info = <<&pmic_dev> <pin> <activate_status>>\n", prop_size);
+                                       return -1;
+                               }
+
+                               parent_pmic_node = ofnode_get_by_phandle(FDT32_TO_CPU(prop_val[0]));
+                               if (!ofnode_valid(parent_pmic_node))
+                               {
+                                       printf("parent_pmic_node  not found\n");
+                                       return -1;
+                               }
+                               int parent_pmic_index = get_node_index(ofnode_get_name(parent_pmic_node));
+                               if (parent_pmic_index < 0)
+                               {
+                                       printf("parent_pmic_node index not found\n");
+                                       return -1;
+                               }
+
+                               ctrl_info->pmic_ctrl_type = PMIC_CTRL_BY_PMIC_GPIO;
+                               ctrl_info->info.pmic_io.pmic_id = parent_pmic_index;
+                               ctrl_info->info.pmic_io.io_hw_id = FDT32_TO_CPU(prop_val[1]);
+                               ctrl_info->info.pmic_io.activate_status = FDT32_TO_CPU(prop_val[2]);
+                               if (ctrl_info->info.pmic_io.activate_status != HW_ID_ACTIVATE_HIGH && ctrl_info->info.pmic_io.activate_status != HW_ID_ACTIVATE_LOW)
+                               {
+                                       printf("pmic io activate should set to: HW_ID_ACTIVATE_HIGH:0 or HW_ID_ACTIVATE_LOW:1");
+                                       return -1;
+                               }
+                               get_pmic_pin_ctrl_info_flag = 1;
+                       }
+
+                       if (get_aon_ctrl_info_flag && get_pmic_pin_ctrl_info_flag)
+                       {
+                               printf("aon_pin_ctrl_info or pmic_pin_ctrl_info should only support one for a pmic dev\n");
+                               return -1;
+                       }
+                       if (!get_aon_ctrl_info_flag && !get_pmic_pin_ctrl_info_flag)
+                       {
+                               printf("aon_pin_ctrl_info or pmic_pin_ctrl_info should only support one for a pmic dev\n");
+                               return -1;
+                       }
+                       return 0;
+               }
+       }
+       ctrl_info->pmic_ctrl_type = PMIC_CTRL_BY_NOTHINTG;
+       return 0;
+}
+
 static int misc_regu_get_pmic_dev_config(ofnode parent_node, pmic_dev_info_t *pmic_dev_info_list)
 {
        int ret = 0;
-       ofnode child_node, errio_node;
-       fdt_addr_t index;
-       char *pmic_name;
+       ofnode child_node;
+       int index;
+       const char *pmic_name;
        int pmic_wdt_flag = 0;
        int pmic_index = 0;
        int pmic_addr_len = 0, pmic_addr_size;
        int gpio_addr_len = 0, gpio_addr_size;
        char err_io_str[40] = "NOT_SUPPORT";
        char lpm_io_str[40] = "NOT_SUPPORT";
+       char parent_pmic_str[60] = "NOT_SUPPORT";
        uint32_t port, pin, trigger_mode;
-       uint32_t phandle;
        const uint32_t *prop_val;
 
        ofnode_for_each_subnode(child_node, parent_node)
@@ -266,7 +368,7 @@ static int misc_regu_get_pmic_dev_config(ofnode parent_node, pmic_dev_info_t *pm
                        pmic_name = ofnode_read_string(child_node, "pmic-name");
                        if (!pmic_name)
                        {
-                               printf("pmic_name property not set for %s%d", PMIC_DEV_DTS_NAME, index);
+                               printf("pmic_name property not set for %s %d", PMIC_DEV_DTS_NAME, index);
                                return -1;
                        }
 
@@ -289,7 +391,7 @@ static int misc_regu_get_pmic_dev_config(ofnode parent_node, pmic_dev_info_t *pm
                        }
                        pmic_addr_size = pmic_addr_len / sizeof(uint32_t);
 
-                       if (pmic_addr_size != 2 &&  pmic_addr_size!= 1)
+                       if (pmic_addr_size != 2 && pmic_addr_size != 1)
                        {
                                printf("invalid pmic-addr cell size %d\n", pmic_addr_size);
                                return -1;
@@ -310,16 +412,23 @@ static int misc_regu_get_pmic_dev_config(ofnode parent_node, pmic_dev_info_t *pm
                                else
                                {
                                        port = FDT32_TO_CPU(prop_val[0]);
-                                       pin = 1 << FDT32_TO_CPU(prop_val[1]);
+                                       pin = FDT32_TO_CPU(prop_val[1]);
                                        trigger_mode = FDT32_TO_CPU(prop_val[2]);
                                        dev->flag |= PMIC_DEV_ENABLE_ERR_IO;
                                        dev->err_io_info.gpio_port = port;
                                        dev->err_io_info.pin = pin;
                                        dev->err_io_info.trigger_mode = trigger_mode;
+                                       if (dev->err_io_info.trigger_mode > GPIO_IRQ_MODE_HIGH_LEVEL)
+                                       {
+                                               printf("io trigger_mode support max:%d, it is set to %d\n", GPIO_IRQ_MODE_HIGH_LEVEL, dev->err_io_info.trigger_mode);
+                                               return -1;
+                                       }
                                        sprintf(err_io_str, "port:%d pin:%d trigger:%d", port, pin, trigger_mode);
                                }
-                       } else {
-                    sprintf(err_io_str, "NOT_SUPPORT");
+                       }
+                       else
+                       {
+                               sprintf(err_io_str, "NOT_SUPPORT");
                        }
 
                        prop_val = ofnode_get_property(child_node, "lpm_gpio", &gpio_addr_len);
@@ -334,24 +443,57 @@ static int misc_regu_get_pmic_dev_config(ofnode parent_node, pmic_dev_info_t *pm
                                else
                                {
                                        port = FDT32_TO_CPU(prop_val[0]);
-                                       pin = 1 << FDT32_TO_CPU(prop_val[1]);
+                                       pin = FDT32_TO_CPU(prop_val[1]);
                                        trigger_mode = FDT32_TO_CPU(prop_val[2]);
                                        dev->flag |= PMIC_DEV_ENABLE_LPM_IO;
                                        dev->lpm_io_info.gpio_port = port;
                                        dev->lpm_io_info.pin = pin;
                                        dev->lpm_io_info.trigger_mode = trigger_mode;
+                                       if (dev->lpm_io_info.trigger_mode > GPIO_IRQ_MODE_HIGH_LEVEL)
+                                       {
+                                               printf("io trigger_mode support max:%d, it is set to %d\n", GPIO_IRQ_MODE_HIGH_LEVEL, dev->lpm_io_info.trigger_mode);
+                                               return -1;
+                                       }
                                        sprintf(lpm_io_str, "port:%d pin:%d trigger:%d", port, pin, trigger_mode);
                                }
-                       } else {
-                               sprintf(lpm_io_str,"NOT_SUPPORT");
+                       }
+                       else
+                       {
+                               sprintf(lpm_io_str, "NOT_SUPPORT");
+                       }
+                       ret = misc_pmic_parent_io_ctrl_config(child_node, &dev->ctrl_info);
+                       if (ret)
+                       {
+                               printf("grep pmic parent io ctrl faild %d\n", ret);
+                               return -1;
+                       }
+                       else
+                       {
+                               if (dev->ctrl_info.pmic_ctrl_type == PMIC_CTRL_BY_AON_GPIO)
+                               {
+                                       sprintf(parent_pmic_str, "ctrl by aon io: port:%d pin:%d activate_status:%d", dev->ctrl_info.info.aon_io.gpio_port, dev->ctrl_info.info.aon_io.pin, dev->ctrl_info.info.aon_io.activate_status);
+                               }
+                               else if (dev->ctrl_info.pmic_ctrl_type == PMIC_CTRL_BY_PMIC_GPIO)
+                               {
+                                       sprintf(parent_pmic_str, "ctrl by pmic io: pmic:%d hw_id:%d activate_status:%d", dev->ctrl_info.info.pmic_io.pmic_id, dev->ctrl_info.info.pmic_io.io_hw_id, dev->ctrl_info.info.pmic_io.activate_status);
+                               }
+                               else
+                               {
+                                       sprintf(parent_pmic_str, "NOT_SUPPORT");
+                               }
                        }
 
                        dev->pmic_id = index;
                        ret = misc_grep_pmic_dev_name_info(pmic_name, dev);
                        pmic_index++;
-                       AON_CONF_D("Get pmic dev:[%d]:%s|%s addr1:0x%02x addr2:0x%02x wdt:{%s} errio:{%s} lpm_io:{%s}\n", index, dev->device_name, dev->version_name, dev->addr1, dev->addr2, (dev->flag & PMIC_DEV_ENABLE_WDT ? "SUPPORT" : "NOT_SUPPORT"), err_io_str, lpm_io_str);
+                       AON_CONF_D("Get pmic dev:[%d]:%s|%s addr1:0x%02x addr2:0x%02x wdt:{%s} errio:{%s} lpm_io:{%s} pmic_ctrl_info:{%s}\n", index, dev->device_name, dev->version_name, dev->addr1, dev->addr2, (dev->flag & PMIC_DEV_ENABLE_WDT ? "SUPPORT" : "NOT_SUPPORT"), err_io_str, lpm_io_str, parent_pmic_str);
                }
        }
+       if (!pmic_index)
+       {
+               printf("No %s node found\n", PMIC_DEV_DTS_NAME);
+               return -1;
+       }
        return 0;
 }
 
@@ -383,15 +525,10 @@ static int misc_regu_get_pmic_dev_by_name(const char *name, int pmic_dev_num, pm
 
 static int misc_regu_get_each_regu_hw_id_config(ofnode regu_id_node, int pmic_dev_num, pmic_dev_info_t *pmic_dev_info_list, soc_virtual_id_t *virtual_id_info, pmic_hw_info_t *id)
 {
-       uint32_t phandle;
        ofnode pmic_node, pmic_parent_node;
 
-       char *pmic_name;
-
        int prop_len, prop_size;
-       int on_order, on_delay_ms;
-       int off_order, off_delay_ms;
-       int pmic_index, parent_pmic_index;
+       int pmic_index;
        const uint32_t *prop_val;
 
        /*get pmic_dev = <&pmic_dev_0 DA9063_ID_BCORE1>*/
@@ -451,12 +588,14 @@ static int misc_regu_get_each_regu_hw_id_config(ofnode regu_id_node, int pmic_de
                }
                (*id).soft_power_ctrl_info.on_info.on_order = FDT32_TO_CPU(prop_val[0]);
                (*id).soft_power_ctrl_info.on_info.on_delay_ms = FDT32_TO_CPU(prop_val[1]);
-               if(prop_size == 3) {
-            (*id).soft_power_ctrl_info.on_info.init_target_uv = FDT32_TO_CPU(prop_val[2]);
-               } else {
+               if (prop_size == 3)
+               {
+                       (*id).soft_power_ctrl_info.on_info.init_target_uv = FDT32_TO_CPU(prop_val[2]);
+               }
+               else
+               {
                        (*id).soft_power_ctrl_info.on_info.init_target_uv = 0;
                }
-               
        }
 
        /*get auto_off_info = <1 1>*/
@@ -507,8 +646,12 @@ static int misc_regu_get_each_regu_hw_id_config(ofnode regu_id_node, int pmic_de
 
                (*id).parent_hw_info.pmic_id = pmic_dev_info_list[pmic_index].pmic_id;
                (*id).parent_hw_info.io_hw_id = FDT32_TO_CPU(prop_val[1]);
-#warning "check status"
                (*id).parent_hw_info.activate_status = FDT32_TO_CPU(prop_val[2]);
+               if (FDT32_TO_CPU(prop_val[2]) != HW_ID_ACTIVATE_HIGH && FDT32_TO_CPU(prop_val[2]) != HW_ID_ACTIVATE_LOW)
+               {
+                       printf("parent hw io activate should set to: HW_ID_ACTIVATE_HIGH:0 or HW_ID_ACTIVATE_LOW:1");
+                       return -1;
+               }
        }
 
        return 0;
@@ -519,13 +662,11 @@ static int misc_regu_get_each_regu_config(ofnode regu_config_node, int pmic_dev_
        int ret = 0;
        ofnode hw_id_node;
        ofnode coupling_node;
-       uint32_t phandle = 0;
        int index = 0;
-       char *regu_id_name;
        const uint32_t *prop_val;
        int prop_len = 0;
        int prop_size = 0;
-    int coupling_num = 0;
+       int coupling_num = 0;
        uint16_t hw_id_used_flag = 0x0;
 
        ofnode_for_each_subnode(hw_id_node, regu_config_node)
@@ -540,9 +681,9 @@ static int misc_regu_get_each_regu_config(ofnode regu_config_node, int pmic_dev_
                                return -1;
                        }
 
-                       if (index >= PMIC_MAX_HW_ID_NUM || index >= 8 * sizeof(uint16_t))
+                       if (index >= PMIC_MAX_HW_ID_NUM || index >= 8 * 2)
                        {
-                               printf("regu_id index should less than %d\n", MIN(PMIC_MAX_HW_ID_NUM, 8 * sizeof(uint16_t)));
+                               printf("regu_id index should less than %d\n", MIN(PMIC_MAX_HW_ID_NUM, 8 * 2));
                                return -1;
                        }
 
@@ -559,11 +700,10 @@ static int misc_regu_get_each_regu_config(ofnode regu_config_node, int pmic_dev_
                        ret = misc_regu_get_each_regu_hw_id_config(hw_id_node, pmic_dev_num, pmic_dev_info_list, regu_info, &pmic_regu_id_info->sub.id[index]);
                        if (ret)
                        {
-                               printf("get hw_id@%d config faild %d\n", ret);
+                               printf("get hw_id@%d config faild %d\n", index, ret);
                                return -1;
                        }
                }
-
        }
 
        for (int i = PMIC_MAX_HW_ID_NUM - 1; i >= 0; i--)
@@ -573,74 +713,81 @@ static int misc_regu_get_each_regu_config(ofnode regu_config_node, int pmic_dev_
                        (*pmic_regu_id_info).sub.id[i].pmic_id = PMIC_ID_INVALID;
                }
        }
-    
+
        ofnode_for_each_subnode(coupling_node, regu_config_node)
        {
                const char *node_name = ofnode_get_name(coupling_node);
 
                if (!strncmp(node_name, COUPLING_ID_INFO_NAME, strlen(COUPLING_ID_INFO_NAME)))
                {
-               /*get info = <0 1 -5 30>;*/
-            prop_val = ofnode_get_property(coupling_node, "info", &prop_len);
-           if (!prop_val)
-           {
-                  printf("no info property set for %s", node_name);
-                  return -1;
-           } else
-           {
-                       prop_size = prop_len / sizeof(uint32_t);
-                       if (prop_size != 4)
-                       {
-                               printf("coupling info property should set in format as info = <id0 id1 max_spread min_spread)>\n");
+                       /*get info = <0 1 -5 30>;*/
+                       prop_val = ofnode_get_property(coupling_node, "info", &prop_len);
+                       if (!prop_val)
+                       {
+                               printf("no info property set for %s", node_name);
                                return -1;
                        }
+                       else
+                       {
+                               prop_size = prop_len / sizeof(uint32_t);
+                               if (prop_size != 4)
+                               {
+                                       printf("coupling info property should set in format as info = <id0 id1 max_spread min_spread)>\n");
+                                       return -1;
+                               }
 
-            int id0 = FDT32_TO_CPU(prop_val[0]);
-                   int id1 = FDT32_TO_CPU(prop_val[1]);
-                       int8_t max_spread = FDT32_TO_CPU(prop_val[2]);
-                       int8_t min_spread = FDT32_TO_CPU(prop_val[3]);
+                               int id0 = FDT32_TO_CPU(prop_val[0]);
+                               int id1 = FDT32_TO_CPU(prop_val[1]);
+                               int8_t max_spread = FDT32_TO_CPU(prop_val[2]);
+                               int8_t min_spread = FDT32_TO_CPU(prop_val[3]);
 
-                       if(ofnode_read_bool(coupling_node, "negative-min")) {
-                 min_spread = -min_spread; 
-                       }
-                       if(ofnode_read_bool(coupling_node, "negative-max")) {
-                 max_spread = -max_spread; 
-                       }
-                       if(id0 == id1) {
-                printf("coupling info: id0 id1 should not be equal");
-                               return -1;
-                       }
-                       if(min_spread > max_spread) {
-                printf("coupling info: min_spread:%d is higher than max_spread:%d", min_spread, max_spread);
-                               return -1;
-                       }
-                       if(id0 >= PMIC_MAX_HW_ID_NUM || id1 >= PMIC_MAX_HW_ID_NUM) {
-                printf("coupling info: id0:%d id1:%d is higher than max_id:%d", id0, id1, PMIC_MAX_HW_ID_NUM -1);
-                               return -1;
-                       }
+                               if (ofnode_read_bool(coupling_node, "negative-min"))
+                               {
+                                       min_spread = -min_spread;
+                               }
+                               if (ofnode_read_bool(coupling_node, "negative-max"))
+                               {
+                                       max_spread = -max_spread;
+                               }
+                               if (id0 == id1)
+                               {
+                                       printf("coupling info: id0 id1 should not be equal");
+                                       return -1;
+                               }
+                               if (min_spread > max_spread)
+                               {
+                                       printf("coupling info: min_spread:%d is higher than max_spread:%d", min_spread, max_spread);
+                                       return -1;
+                               }
+                               if (id0 >= PMIC_MAX_HW_ID_NUM || id1 >= PMIC_MAX_HW_ID_NUM)
+                               {
+                                       printf("coupling info: id0:%d id1:%d is higher than max_id:%d", id0, id1, PMIC_MAX_HW_ID_NUM - 1);
+                                       return -1;
+                               }
 
-                       if((*pmic_regu_id_info).sub.id[id0].pmic_id == PMIC_ID_INVALID || (*pmic_regu_id_info).sub.id[id1].pmic_id == PMIC_ID_INVALID) {
-                printf("coupling info:id0:%d id1:%d is invalid", id0, id1);
-                               return -1;
-                       }
-                       (*pmic_regu_id_info).sub.coupling_list[coupling_num].id0 = id0;
-                       (*pmic_regu_id_info).sub.coupling_list[coupling_num].id1 = id1;
-                       (*pmic_regu_id_info).sub.coupling_list[coupling_num].max_spread = max_spread;
-                       (*pmic_regu_id_info).sub.coupling_list[coupling_num].min_spread = min_spread;
-                       coupling_num++;
-                       if(coupling_num > PMIC_MAX_COUPLING_NUM) {
-                printf("coupling info should no more than %d\n", coupling_num);
-                               return -1;
+                               if ((*pmic_regu_id_info).sub.id[id0].pmic_id == PMIC_ID_INVALID || (*pmic_regu_id_info).sub.id[id1].pmic_id == PMIC_ID_INVALID)
+                               {
+                                       printf("coupling info:id0:%d id1:%d is invalid", id0, id1);
+                                       return -1;
+                               }
+                               (*pmic_regu_id_info).sub.coupling_list[coupling_num].id0 = id0;
+                               (*pmic_regu_id_info).sub.coupling_list[coupling_num].id1 = id1;
+                               (*pmic_regu_id_info).sub.coupling_list[coupling_num].max_spread = max_spread;
+                               (*pmic_regu_id_info).sub.coupling_list[coupling_num].min_spread = min_spread;
+                               coupling_num++;
+                               if (coupling_num > PMIC_MAX_COUPLING_NUM)
+                               {
+                                       printf("coupling info should no more than %d\n", coupling_num);
+                                       return -1;
+                               }
                        }
-          }
                }
-
        }
 
-       for(int i = PMIC_MAX_COUPLING_NUM - 1; i >= coupling_num; i--)
+       for (int i = PMIC_MAX_COUPLING_NUM - 1; i >= coupling_num; i--)
        {
-       (*pmic_regu_id_info).sub.coupling_list[i].id0 =  REGU_SUB_ID_INVALID;
-          (*pmic_regu_id_info).sub.coupling_list[i].id1 =  REGU_SUB_ID_INVALID;
+               (*pmic_regu_id_info).sub.coupling_list[i].id0 = REGU_SUB_ID_INVALID;
+               (*pmic_regu_id_info).sub.coupling_list[i].id1 = REGU_SUB_ID_INVALID;
        }
 
        return 0;
@@ -649,11 +796,10 @@ static int misc_regu_get_each_regu_config(ofnode regu_config_node, int pmic_dev_
 static int misc_regu_get_regu_config(ofnode parent_node, int pmic_dev_num, pmic_dev_info_t *pmic_dev_info_list, int virtual_id_num, soc_virtual_id_t *regu_list, csi_regu_id_t *pmic_regu_id_list)
 {
        ofnode child_node;
-       int index = 0;
        uint32_t phandle = 0;
        int ret = 0;
        ofnode regu_virtual_node;
-       char *regu_id_name;
+       const char *regu_id_name;
        int virtual_id_index = 0;
        uint16_t virtual_id_config_flag = 0;
        int regu_config_index = 0;
@@ -661,7 +807,7 @@ static int misc_regu_get_regu_config(ofnode parent_node, int pmic_dev_num, pmic_
        ofnode_for_each_subnode(child_node, parent_node)
        {
                virtual_id_index = 0;
-               char *node_name = ofnode_get_name(child_node);
+               const char *node_name = ofnode_get_name(child_node);
                if (!strncmp(node_name, REGU_ID_CONF_NAME, strlen(REGU_ID_CONF_NAME)))
                {
 
@@ -718,7 +864,7 @@ static int misc_regu_get_regu_config(ofnode parent_node, int pmic_dev_num, pmic_
                                return -1;
                        }
 
-                       AON_CONF_D("Get regu config, virtual_regu_id:[%d]:%s min_uv:%dmv max_uv:%dmv\n", virtual_id, regu_list[virtual_id_index].virtual_id_name, regu_list[virtual_id_index].min_uv,regu_list[virtual_id_index].max_uv);
+                       AON_CONF_D("Get regu config, virtual_regu_id:[%d]:%s min_uv:%dmv max_uv:%dmv\n", virtual_id, regu_list[virtual_id_index].virtual_id_name, regu_list[virtual_id_index].min_uv, regu_list[virtual_id_index].max_uv);
                        for (int i = 0; i < ARRAY_SIZE(regu_conf->sub.id); i++)
                        {
                                pmic_hw_info_t *sub = &regu_conf->sub.id[i];
@@ -758,24 +904,31 @@ static int misc_regu_get_regu_config(ofnode parent_node, int pmic_dev_num, pmic_
                                }
                        }
                        int temp_flag = 0;
-                       for(int i = 0; i < ARRAY_SIZE(regu_conf->sub.coupling_list); i++) {
-                coupling_desc_t* coupling_info = &regu_conf->sub.coupling_list[i];
-                               if(coupling_info->id0 != REGU_SUB_ID_INVALID) {
-                                       if(!temp_flag) {
-                        AON_CONF_D(">>>>>>");
+                       for (int i = 0; i < ARRAY_SIZE(regu_conf->sub.coupling_list); i++)
+                       {
+                               coupling_desc_t *coupling_info = &regu_conf->sub.coupling_list[i];
+                               if (coupling_info->id0 != REGU_SUB_ID_INVALID)
+                               {
+                                       if (!temp_flag)
+                                       {
+                                               AON_CONF_D(">>>>>>");
                                                temp_flag = 1;
                                        }
-                    AON_CONF_D("%s@%d:{id0:%d id1:%d max_spreed:%dmv min_spreed:%dmv}   ", COUPLING_ID_INFO_NAME, i,coupling_info->id0, coupling_info->id1, coupling_info->max_spread *10 , coupling_info->min_spread * 10);
+                                       AON_CONF_D("%s@%d:{id0:%d id1:%d max_spreed:%dmv min_spreed:%dmv}   ", COUPLING_ID_INFO_NAME, i, coupling_info->id0, coupling_info->id1, coupling_info->max_spread * 10, coupling_info->min_spread * 10);
                                }
                        }
-                       if(temp_flag) {
+                       if (temp_flag)
+                       {
                                AON_CONF_D("\n");
                        }
                        regu_config_index++;
                }
        }
-
-#warning "add no config check"
+       if (!regu_config_index)
+       {
+               printf("No %s node found\n", REGU_ID_CONF_NAME);
+               return -1;
+       }
        return 0;
 }
 
@@ -816,7 +969,7 @@ static int misc_regu_get_aon_pmic_config(struct udevice *dev, ofnode parent_node
        if (ret)
        {
                printf("pmic dev config get faild %d", ret);
-#warning "free"
+               free(pmic_dev_info_list);
                return -1;
        }
 
@@ -846,7 +999,8 @@ static int misc_regu_get_aon_pmic_config(struct udevice *dev, ofnode parent_node
        if (ret)
        {
                printf("get regu config faild %d\n", ret);
-#warning "free"
+               free(pmic_dev_info_list);
+               free(pmic_regu_id_list);
                return -1;
        }
 
@@ -859,15 +1013,19 @@ static int misc_regu_get_aon_pmic_config(struct udevice *dev, ofnode parent_node
        return 0;
 }
 
+extern int device_bind_ofnode(struct udevice *parent, const struct driver *driver,
+                       const char *name, const void *platdata, ofnode node,
+                       struct udevice **devp);
+
 static int misc_regu_bind(struct udevice *dev)
 {
        struct mic_regu_platdata *plat = dev_get_platdata(dev);
        ofnode parent_node = dev->node;
-
+       const uint32_t *prop_val;
+       int prop_len = 0;
+       int prop_size = 0;
        int ret;
-       ofnode child_node, node, regu_node, aon_conf_node;
-       const void *blob = gd->fdt_blob;
-       int subnode;
+       ofnode child_node, aon_conf_node = {0}, regu_node = {0};
        struct udevice *dev_1;
 
        /* If this is a child device, there is nothing to do here */
@@ -888,7 +1046,7 @@ static int misc_regu_bind(struct udevice *dev)
        ofnode_for_each_subnode(child_node, parent_node)
        {
                /* Increment base_id for all subnodes, also the disabled ones */
-               //printf("sub node name: %s\n", ofnode_get_name(child_node));
+               // printf("sub node name: %s\n", ofnode_get_name(child_node));
                if (!strncmp(ofnode_get_name(child_node), REGU_DTS_NAME, strlen(REGU_DTS_NAME)))
                {
                        regu_node = child_node;
@@ -901,8 +1059,6 @@ static int misc_regu_bind(struct udevice *dev)
                }
        }
 
-
-
        if (!get_regu_dts_flag)
        {
                printf("No %s node in dts\n", REGU_DTS_NAME);
@@ -921,18 +1077,48 @@ static int misc_regu_bind(struct udevice *dev)
                return -ENOMEM;
        }
 
-       plat->wakeup_flag  = 0;
+       plat->wakeup_flag = 0;
 
-       if (ofnode_read_bool(parent_node, "wakeup-by-gpio-on")) {
+       if (ofnode_read_bool(parent_node, "wakeup-by-gpio-on"))
+       {
                plat->wakeup_flag |= AON_WAKEUP_BY_GPIO;
                printf("aon wakeup by gpio enabled\n");
        }
 
-       if (ofnode_read_bool(parent_node, "wakeup-by-rtc-on")) {
+       if (ofnode_read_bool(parent_node, "wakeup-by-rtc-on"))
+       {
                plat->wakeup_flag |= AON_WAKEUP_BY_RTC;
                printf("aon wakeup by rtc enabled\n");
        }
 
+       /*grep ii-config info*/
+       prop_val = ofnode_get_property(aon_conf_node, "iic-config", &prop_len);
+       if (!prop_val)
+       {
+               printf("pmic-addr property not found\n");
+               return -1;
+       }
+       prop_size = prop_len / sizeof(uint32_t);
+       if (prop_size != 3)
+       {
+               printf("invalid iic-config cell size %d,it should set in format as iic-config = <<id> <addr_mode> <speed>>\n", prop_size);
+               return -1;
+       }
+       plat->iic_config.iic_id = FDT32_TO_CPU(prop_val[0]);
+       plat->iic_config.addr_mode = FDT32_TO_CPU(prop_val[1]);
+       plat->iic_config.speed = FDT32_TO_CPU(prop_val[2]);
+       if (plat->iic_config.addr_mode > IIC_ADDRESS_10BIT)
+       {
+               printf("iic addr_mode only support IIC_ADDRESS_7BIT:0 IIC_ADDRESS_10BIT:1\n");
+               return -1;
+       }
+       if (plat->iic_config.speed > IIC_BUS_SPEED_HIGH)
+       {
+               printf("iic speed max support IIC_BUS_SPEED_HIGH:%d\n", IIC_BUS_SPEED_HIGH);
+               return -1;
+       }
+       printf("iic id:%d addr_mode:%d speed:%d\n", plat->iic_config.iic_id, plat->iic_config.addr_mode, plat->iic_config.speed);
+
        ret = misc_regu_get_virtual_regu_config(dev, regu_node, &plat->regu_list);
        if (ret)
        {
index c383ffa59367a9e4f666479767e5afe0571d52ba..b1a3845425686380cd978d2c69fbff0abd4d9e06 100644 (file)
@@ -1,7 +1,6 @@
 #ifndef __LIGHT_REGU_H__
 #define __LIGHT_REGU_H__
 
-
 typedef enum
 {
        SOC_DVDD18_AON,           /*da9063:  ldo-3 */
@@ -35,25 +34,23 @@ typedef enum
        SOC_REGU_INVALID = 0xFF
 } soc_virtual_id_en;
 
-
 #define REGU_DTS_NAME "light-regu-reg"
 #define AON_CONF_NAME "aon_pmic_config"
 #define PMIC_DEV_DTS_NAME "pmic-dev"
+#define PMIC_PARENT_CTRL_NAME "pmic_ctrl_info"
 #define REGU_ID_CONF_NAME "regu_config"
-#define REGU_ID_NAME      "regu_id"
-#define COUPLING_ID_INFO_NAME  "coupling_info"
-
+#define REGU_ID_NAME "regu_id"
+#define COUPLING_ID_INFO_NAME "coupling_info"
 
+#define PMIC_DEV_ENABLE_WDT (1U << 0)
+#define PMIC_DEV_ENABLE_ERR_IO (1U << 1)
+#define PMIC_DEV_ENABLE_LPM_IO (1U << 2)
 
-#define PMIC_DEV_ENABLE_WDT                (1U << 0)
-#define PMIC_DEV_ENABLE_ERR_IO             (1U << 1)
-#define PMIC_DEV_ENABLE_LPM_IO             (1U << 2)
-
-#define HW_ID_NO_SOFT_AUTO_ON   (0xff)
-#define HW_ID_NO_SOFT_AUTO_OFF  (0xff)
-#define HW_ID_INVALID           (0xff)
-#define PMIC_ID_INVALID         (0xff)
-#define REGU_SUB_ID_INVALID     (0xff)
+#define HW_ID_NO_SOFT_AUTO_ON (0xff)
+#define HW_ID_NO_SOFT_AUTO_OFF (0xff)
+#define HW_ID_INVALID (0xff)
+#define PMIC_ID_INVALID (0xff)
+#define REGU_SUB_ID_INVALID (0xff)
 
 #define REGU_EXT_ID_NAME_LEN 30
 #define PMIC_DEV_NAME_LEN 20
@@ -63,108 +60,148 @@ typedef enum
 #define PMIC_MAX_COUPLING_NUM 3
 
 #define AON_WAKEUP_BY_GPIO (1 << 0)
-#define AON_WAKEUP_BY_RTC  (1 << 1)
+#define AON_WAKEUP_BY_RTC (1 << 1)
+
+#define AON_CONFIG_MAGIC "AON_CONFIG"
+#define UBOOT_CONFIG_MAGIC "UBOOT_SET"
+#define AON_CONFIG_VERSION "1.0.0"
 
-typedef enum {
-   HW_ID_ACTIVATE_HIGH  = 0U,
-   HW_ID_ACTIVATE_LOW =   1U,
+typedef enum
+{
+       HW_ID_ACTIVATE_HIGH = 0U,
+       HW_ID_ACTIVATE_LOW = 1U,
 } hw_activate_status_en;
 
-typedef struct __packed {
+typedef struct __packed
+{
        uint8_t pmic_id;
-    uint8_t io_hw_id;
-    uint8_t activate_status;
+       uint8_t io_hw_id;
+       uint8_t activate_status;
 } pmic_parent_hw_io_ctrl_info_t;
 
-typedef struct __packed  {
-    uint8_t   on_order;
-       uint8_t   on_delay_ms;
-    uint32_t  init_target_uv;
+typedef struct __packed
+{
+       uint8_t on_order;
+       uint8_t on_delay_ms;
+       uint32_t init_target_uv;
 } regu_soft_power_ctrl_on_t;
 
-typedef struct __packed {
-    uint8_t off_order;
+typedef struct __packed
+{
+       uint8_t off_order;
        uint8_t off_delay_ms;
 } regu_soft_power_ctrl_off_t;
 
-typedef struct __packed {
-   regu_soft_power_ctrl_on_t  on_info;
-   regu_soft_power_ctrl_off_t off_info;
+typedef struct __packed
+{
+       regu_soft_power_ctrl_on_t on_info;
+       regu_soft_power_ctrl_off_t off_info;
 } regu_soft_power_ctrl_t;
 
-
-typedef struct __packed {
+typedef struct __packed
+{
        uint8_t id0;
        uint8_t id1;
        int8_t max_spread; // mv/10
        int8_t min_spread; // mv/10
-}coupling_desc_t;
+} coupling_desc_t;
 
+typedef enum
+{
+       GPIO_IRQ_MODE_RISING_EDGE = 0, ///< Interrupt mode for rising edge
+       GPIO_IRQ_MODE_FALLING_EDGE,        ///< Interrupt mode for falling edge
+       GPIO_IRQ_MODE_BOTH_EDGE,           ///< Interrupt mode for both edge
+       GPIO_IRQ_MODE_LOW_LEVEL,           ///< Interrupt mode for low level
+       GPIO_IRQ_MODE_HIGH_LEVEL,          ///< Interrupt mode for high level
+} csi_gpio_irq_mode_t;
 
-typedef struct __packed {
-   uint8_t pmic_id;
-   uint8_t hw_id;
-   uint8_t benable;
-   pmic_parent_hw_io_ctrl_info_t parent_hw_info;
-   regu_soft_power_ctrl_t soft_power_ctrl_info;
-} pmic_hw_info_t;
+typedef enum
+{
+       IIC_ADDRESS_7BIT = 0U, ///< 7-bit address mode
+       IIC_ADDRESS_10BIT          ///< 10-bit address mode
+} csi_iic_addr_mode_t;
 
+typedef enum
+{
+       IIC_BUS_SPEED_STANDARD = 0U, ///< Standard Speed  (<=100kHz)
+       IIC_BUS_SPEED_FAST,                      ///< Fast Speed      (<=400kHz)
+       IIC_BUS_SPEED_FAST_PLUS,         ///< Fast plus Speed (<=  1MHz)
+       IIC_BUS_SPEED_HIGH                       ///< High Speed      (<=3.4MHz)
+} csi_iic_speed_t;
 
-typedef        struct __packed{
+typedef struct __packed
+{
+       uint8_t pmic_id;
+       uint8_t hw_id;
+       uint8_t benable;
+       pmic_parent_hw_io_ctrl_info_t parent_hw_info;
+       regu_soft_power_ctrl_t soft_power_ctrl_info;
+} pmic_hw_info_t;
+
+typedef struct __packed
+{
        coupling_desc_t coupling_list[PMIC_MAX_COUPLING_NUM];
-       pmic_hw_info_t  id[PMIC_MAX_HW_ID_NUM];                             ///<  sub id1 for single-rail or first src of dual-rail
-}pmic_hw_id_t;
-
-typedef struct __packed {
-       uint8_t     regu_ext_id;                   ///< virtual global regulator id
-       char        regu_ext_id_name[REGU_EXT_ID_NAME_LEN];             ///< vitual regu-id name
-       pmic_hw_id_t sub;                           ///<  sub id set for dual-rail/single-rail regulator
-}csi_regu_id_t;
-
-typedef enum {
-   PMIC_CTRL_BY_AON_GPIO =  0U,
-   PMIC_CTRL_BY_PMIC_GPIO = 1U,
-   PMIC_CTRL_BY_NOTHINTG  = 0xFF,
+       pmic_hw_info_t id[PMIC_MAX_HW_ID_NUM]; ///<  sub id1 for single-rail or first src of dual-rail
+} pmic_hw_id_t;
+
+typedef struct __packed
+{
+       uint8_t regu_ext_id;                                             ///< virtual global regulator id
+       char regu_ext_id_name[REGU_EXT_ID_NAME_LEN]; ///< vitual regu-id name
+       pmic_hw_id_t sub;                                                        ///<  sub id set for dual-rail/single-rail regulator
+} csi_regu_id_t;
+
+typedef enum
+{
+       PMIC_CTRL_BY_AON_GPIO = 0U,
+       PMIC_CTRL_BY_PMIC_GPIO = 1U,
+       PMIC_CTRL_BY_NOTHINTG = 0xFF,
 } pmic_ctrl_info_en;
 
-typedef struct __packed {
-    uint8_t port;
+typedef struct __packed
+{
+       uint8_t gpio_port;
        uint8_t pin;
-    uint8_t activate_status;
+       uint8_t activate_status;
 } pmic_ctrl_by_aon_info_t;
 
-typedef struct __packed {
+typedef struct __packed
+{
        uint8_t pmic_id;
-    uint8_t io_hw_id;
-    uint8_t activate_status;
+       uint8_t io_hw_id;
+       uint8_t activate_status;
 } pmic_ctrl_by_pmic_info_t;
 
-typedef struct __packed {
-    uint8_t pmic_ctrl_type;
-       union {
-       pmic_ctrl_by_aon_info_t  aon_io_info;
-          pmic_ctrl_by_pmic_info_t pmic_io_info;
-       };
+typedef struct __packed
+{
+       uint8_t pmic_ctrl_type;
+       union
+       {
+               pmic_ctrl_by_aon_info_t aon_io;
+               pmic_ctrl_by_pmic_info_t pmic_io;
+       } info;
 } pmic_parent_ctrl_info_t;
 
-typedef struct  __packed{
-        uint16_t gpio_port;
-     uint16_t pin;
-        uint8_t  trigger_mode;
+typedef struct __packed
+{
+       uint8_t gpio_port;
+       uint8_t pin;
+       uint8_t trigger_mode;
 } pmic_interrupt_io_info_t;
 
-typedef struct __packed  {
-    char device_name[PMIC_DEV_NAME_LEN];
-    char version_name[PMIC_DEV_VERSION_LEN];
-    uint8_t pmic_id;
-    uint8_t addr1;
-    uint8_t addr2;
-       uint8_t flag;          /*support wdt|errio| lpm io*/
+typedef struct __packed
+{
+       char device_name[PMIC_DEV_NAME_LEN];
+       char version_name[PMIC_DEV_VERSION_LEN];
+       uint8_t pmic_id;
+       uint8_t addr1;
+       uint8_t addr2;
+       uint8_t flag; /*support wdt|errio| lpm io*/
        uint8_t slew_rate;
-       uint32_t    wdt_len;
+       uint32_t wdt_len;
        pmic_interrupt_io_info_t err_io_info;
        pmic_interrupt_io_info_t lpm_io_info;
-    pmic_parent_ctrl_info_t ctrl_info;
+       pmic_parent_ctrl_info_t ctrl_info;
 } pmic_dev_info_t;
 
 typedef struct
@@ -193,37 +230,42 @@ typedef struct
        csi_regu_id_t *regu_id_list;
 } regu_id_list_t;
 
+typedef struct __packed
+{
+       uint8_t iic_id;    ///< iic id
+       uint8_t addr_mode; ///< iic addr_mode  ---> csi_iic_addr_mode_t
+       uint8_t speed;     ///< iic speed type  ---> csi_iic_speed_t
+       uint8_t reserved[1];
+} csi_pmic_if_config_t;
+
 struct mic_regu_platdata
 {
        const char *name;
-       uint32_t  wakeup_flag;
+       uint32_t wakeup_flag;
+       csi_pmic_if_config_t iic_config;
        virtual_regu_list_t regu_list;
        pmic_dev_list_t pmic_list;
        regu_id_list_t regu_id_list;
 };
 
-
-#define   AON_CONFIG_MAGIC   "AON_CONFIG"
-#define   AON_CONFIG_VERSION "1.0.0"
-
-typedef  struct __packed{
-       uint8_t iic_id;
-    uint8_t pmic_dev_num;
-    uint8_t regu_num;
-       int pmic_dev_list_offset;
-       int regu_id_list_offset;
-}aon_pmic_config_t;
-
-typedef  struct  __packed{
-   const char  magic[11];
-   const char  version[11];
-   uint8_t   max_hw_id_num;
-   uint64_t  aon_config_partition_size;
-   uint32_t  wakeup_flag;
-   aon_pmic_config_t aon_pmic;
+typedef struct __packed
+{
+       csi_pmic_if_config_t iic_config;
+       uint8_t pmic_dev_num;
+       uint8_t regu_num;
+       uint32_t pmic_dev_list_offset;
+       uint32_t regu_id_list_offset;
+} aon_pmic_config_t;
+
+typedef struct __packed
+{
+       const char magic[11];
+       const char version[11];
+       const char uboot_set_magic[11];
+       uint8_t max_hw_id_num;
+       uint64_t aon_config_partition_size;
+       uint32_t wakeup_flag;
+       aon_pmic_config_t aon_pmic;
 } aon_config_t;
 
-
-
-
 #endif
\ No newline at end of file