diff --git a/linux-ramdump-parser-v2/parsers/clockdump.py b/linux-ramdump-parser-v2/parsers/clockdump.py
old mode 100755
new mode 100644
index 09b4657d3c1efe6ecd92acf4be0d2afb75688b49..fd7eedccb4e152f6a97ef6c7d439b6a29e14dead
--- a/linux-ramdump-parser-v2/parsers/clockdump.py
+++ b/linux-ramdump-parser-v2/parsers/clockdump.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2015, The Linux Foundation. All rights reserved.
+# Copyright (c) 2015,2017 The Linux Foundation. All rights reserved.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License version 2 and
@@ -13,8 +13,9 @@ import linux_list
 from print_out import print_out_str
 from parser_util import register_parser, RamParser
 
+
 @register_parser('--clock-dump', 'Dump all the clocks in the system')
-class ClockDumps(RamParser) :
+class ClockDumps(RamParser):
 
     def __init__(self, *args):
         super(ClockDumps, self).__init__(*args)
@@ -118,14 +119,7 @@ class ClockDumps(RamParser) :
         clk_providers_walker = linux_list.ListWalker(self.ramdump, head, node_offset)
         clk_providers_walker.walk(head, self.clk_providers_walker)
 
-    def clk_providers_walker(self, node):
-        if node == self.head:
-            return
-
-        data_address = node + self.ramdump.field_offset('struct of_clk_provider', 'data')
-        node_address = node + self.ramdump.field_offset('struct of_clk_provider', 'node')
-        data = self.ramdump.read_word(data_address, True)
-        node = self.ramdump.read_word(node_address, True)
+    def print_clk_of_msm_provider_data(self, data):
         table_address = data + self.ramdump.field_offset('struct of_msm_provider_data', 'table')
         size_address = data + self.ramdump.field_offset('struct of_msm_provider_data', 'size')
         table = self.ramdump.read_word(table_address, True)
@@ -163,6 +157,73 @@ class ClockDumps(RamParser) :
             counter = counter + 1
             table = table + self.ramdump.sizeof('struct clk_lookup')
 
+    def print_clk_onecell_data(self, data):
+        offset_clk_onecell_data_clks = (
+                self.ramdump.field_offset('struct clk_onecell_data', 'clks'))
+        offset_clk_onecell_data_clknum = (
+                            self.ramdump.field_offset(
+                                'struct clk_onecell_data', 'clk_num'))
+        clks = self.ramdump.read_word(data + offset_clk_onecell_data_clks)
+        size = self.ramdump.read_int(data + offset_clk_onecell_data_clknum)
+        sizeof_clk_pointer = self.ramdump.sizeof('struct clk *')
+        offset_vdd_cur_level = self.ramdump.field_offset(
+                                    'struct clk_vdd_class', 'cur_level')
+        counter = 0
+
+        while counter < size:
+            clk = self.ramdump.read_word(clks + (sizeof_clk_pointer * counter))
+            if clk == 0 or clk is None:
+                counter = counter + 1
+                continue
+            clk_core = self.ramdump.read_structure_field(
+                                                    clk, 'struct clk', 'core')
+            if clk_core == 0 or clk_core is None:
+                counter = counter + 1
+                continue
+            clk_name_addr = self.ramdump.read_structure_field(
+                                        clk_core, 'struct clk_core', 'name')
+            clk_name = self.ramdump.read_cstring(clk_name_addr, 48)
+            clk_prepare_count = self.ramdump.read_structure_field(
+                                clk_core, 'struct clk_core', 'prepare_count')
+            clk_enable_count = self.ramdump.read_structure_field(
+                                clk_core, 'struct clk_core', 'enable_count')
+            clk_rate = self.ramdump.read_structure_field(
+                                    clk_core, 'struct clk_core', 'rate')
+            clk_vdd_class_addr = (
+                    self.ramdump.read_structure_field(
+                        clk_core, 'struct clk_core', 'vdd_class'))
+            vdd_class = self.ramdump.read_word(clk_vdd_class_addr)
+            cur_level = 0
+            if vdd_class != 0 and vdd_class is not None:
+                cur_level_address = (vdd_class + offset_vdd_cur_level)
+                cur_level = self.ramdump.read_word(cur_level_address, True)
+            formatStr  = "{0:40} {1:<2}/ {2:<17} {3:<25} {4:<10} v.v (struct clk_core *)0x{5:<20x}\n"
+            output = formatStr.format(
+                                    clk_name,
+                                    clk_enable_count,
+                                    clk_prepare_count,
+                                    clk_rate, cur_level,
+                                    clk_core)
+            if clk_enable_count > 0:
+                self.enabled_clocks.append(output)
+            elif clk_prepare_count > 0:
+                self.prepared_clocks.append(output)
+            else:
+                self.disabled_clocks.append(output)
+            counter = counter + 1
+
+    def clk_providers_walker(self, node):
+        if node == self.head:
+            return
+        data_address = node + self.ramdump.field_offset(
+                                    'struct of_clk_provider', 'data')
+        data = self.ramdump.read_word(data_address, True)
+
+        if (self.ramdump.kernel_version < (4, 4, 38)):
+            self.print_clk_of_msm_provider_data(data)
+        else:
+            self.print_clk_onecell_data(data)
+
     def parse(self):
         self.output_file = self.ramdump.open_file('ClockDumps.txt')