diff options
Diffstat (limited to 'extras/recipes-kernel/linux/linux-omap/dvfs/0009-OMAP-Introduce-device-specific-set-rate-and-get-rate.patch')
-rw-r--r-- | extras/recipes-kernel/linux/linux-omap/dvfs/0009-OMAP-Introduce-device-specific-set-rate-and-get-rate.patch | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/extras/recipes-kernel/linux/linux-omap/dvfs/0009-OMAP-Introduce-device-specific-set-rate-and-get-rate.patch b/extras/recipes-kernel/linux/linux-omap/dvfs/0009-OMAP-Introduce-device-specific-set-rate-and-get-rate.patch new file mode 100644 index 00000000..f5914aa3 --- /dev/null +++ b/extras/recipes-kernel/linux/linux-omap/dvfs/0009-OMAP-Introduce-device-specific-set-rate-and-get-rate.patch @@ -0,0 +1,120 @@ +From 6ec7cf889c9a8ddf97fbbcbda4888b0f17930e04 Mon Sep 17 00:00:00 2001 +From: Thara Gopinath <thara@ti.com> +Date: Fri, 29 Oct 2010 20:43:29 +0530 +Subject: [PATCH 09/20] OMAP: Introduce device specific set rate and get rate in omap_device structure + +This patch extends the omap_device structure to contain +pointers to scale the operating rate of the +device and to retrieve the operating rate of the device. +This patch also adds the three new APIs in the omap device layer +namely omap_device_set_rate that can be called to set a new operating +rate for a device, omap_device_get_rate that can be called to retrieve +the operating frequency for a device and omap_device_populate_rate_fns +to populte the device specific set_rate and get_rate API's. +The omap_device_set_rate and omap_device_get_rate does some routine error +checks and finally calls into the device specific set_rate +and get_rate APIs populated through omap_device_populate_rate_fns. + +Signed-off-by: Thara Gopinath <thara@ti.com> +--- + arch/arm/plat-omap/include/plat/omap_device.h | 9 +++++ + arch/arm/plat-omap/omap_device.c | 49 +++++++++++++++++++++++++ + 2 files changed, 58 insertions(+), 0 deletions(-) + +diff --git a/arch/arm/plat-omap/include/plat/omap_device.h b/arch/arm/plat-omap/include/plat/omap_device.h +index e4c349f..1178b86 100644 +--- a/arch/arm/plat-omap/include/plat/omap_device.h ++++ b/arch/arm/plat-omap/include/plat/omap_device.h +@@ -50,6 +50,8 @@ extern struct device omap_device_parent; + * @hwmods: (one .. many per omap_device) + * @hwmods_cnt: ARRAY_SIZE() of @hwmods + * @pm_lats: ptr to an omap_device_pm_latency table ++ * @set_rate: fn ptr to change the operating rate. ++ * @get_rate: fn ptr to retrieve the current operating rate. + * @pm_lats_cnt: ARRAY_SIZE() of what is passed to @pm_lats + * @pm_lat_level: array index of the last odpl entry executed - -1 if never + * @dev_wakeup_lat: dev wakeup latency in nanoseconds +@@ -67,6 +69,8 @@ struct omap_device { + struct platform_device pdev; + struct omap_hwmod **hwmods; + struct omap_device_pm_latency *pm_lats; ++ int (*set_rate)(struct device *dev, unsigned long rate); ++ unsigned long (*get_rate) (struct device *dev); + u32 dev_wakeup_lat; + u32 _dev_wakeup_lat_limit; + u8 pm_lats_cnt; +@@ -108,6 +112,11 @@ int omap_device_align_pm_lat(struct platform_device *pdev, + u32 new_wakeup_lat_limit); + struct powerdomain *omap_device_get_pwrdm(struct omap_device *od); + u32 omap_device_get_context_loss_count(struct platform_device *pdev); ++int omap_device_set_rate(struct device *dev, unsigned long freq); ++unsigned long omap_device_get_rate(struct device *dev); ++void omap_device_populate_rate_fns(struct device *dev, ++ int (*set_rate)(struct device *dev, unsigned long rate), ++ unsigned long (*get_rate) (struct device *dev)); + + /* Other */ + +diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c +index 2c95e61..0d67af6 100644 +--- a/arch/arm/plat-omap/omap_device.c ++++ b/arch/arm/plat-omap/omap_device.c +@@ -813,6 +813,55 @@ int omap_device_enable_clocks(struct omap_device *od) + return 0; + } + ++int omap_device_set_rate(struct device *dev, unsigned long freq) ++{ ++ struct platform_device *pdev; ++ struct omap_device *od; ++ ++ pdev = container_of(dev, struct platform_device, dev); ++ od = _find_by_pdev(pdev); ++ ++ if (!od->set_rate) { ++ dev_err(dev, "%s: No set_rate API for scaling device\n", ++ __func__); ++ return -ENODATA; ++ } ++ ++ return od->set_rate(dev, freq); ++} ++ ++unsigned long omap_device_get_rate(struct device *dev) ++{ ++ struct platform_device *pdev; ++ struct omap_device *od; ++ ++ pdev = container_of(dev, struct platform_device, dev); ++ od = _find_by_pdev(pdev); ++ ++ ++ if (!od->get_rate) { ++ dev_err(dev, "%s: No get rate API for the device\n", ++ __func__); ++ return 0; ++ } ++ ++ return od->get_rate(dev); ++} ++ ++void omap_device_populate_rate_fns(struct device *dev, ++ int (*set_rate)(struct device *dev, unsigned long rate), ++ unsigned long (*get_rate) (struct device *dev)) ++{ ++ struct platform_device *pdev; ++ struct omap_device *od; ++ ++ pdev = container_of(dev, struct platform_device, dev); ++ od = _find_by_pdev(pdev); ++ ++ od->set_rate = set_rate; ++ od->get_rate = get_rate; ++} ++ + struct device omap_device_parent = { + .init_name = "omap", + .parent = &platform_bus, +-- +1.6.6.1 + |