linux/arch/arm/mach-s5pv310/dev-pd.c
<<
>>
Prefs
   1/* linux/arch/arm/mach-s5pv310/dev-pd.c
   2 *
   3 * Copyright (c) 2010 Samsung Electronics Co., Ltd.
   4 *              http://www.samsung.com
   5 *
   6 * S5PV310 - Power Domain support
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License version 2 as
  10 * published by the Free Software Foundation.
  11*/
  12
  13#include <linux/io.h>
  14#include <linux/kernel.h>
  15#include <linux/platform_device.h>
  16#include <linux/delay.h>
  17
  18#include <mach/regs-pmu.h>
  19
  20#include <plat/pd.h>
  21
  22static int s5pv310_pd_enable(struct device *dev)
  23{
  24        struct samsung_pd_info *pdata =  dev->platform_data;
  25        u32 timeout;
  26
  27        __raw_writel(S5P_INT_LOCAL_PWR_EN, pdata->base);
  28
  29        /* Wait max 1ms */
  30        timeout = 10;
  31        while ((__raw_readl(pdata->base + 0x4) & S5P_INT_LOCAL_PWR_EN)
  32                != S5P_INT_LOCAL_PWR_EN) {
  33                if (timeout == 0) {
  34                        printk(KERN_ERR "Power domain %s enable failed.\n",
  35                                dev_name(dev));
  36                        return -ETIMEDOUT;
  37                }
  38                timeout--;
  39                udelay(100);
  40        }
  41
  42        return 0;
  43}
  44
  45static int s5pv310_pd_disable(struct device *dev)
  46{
  47        struct samsung_pd_info *pdata =  dev->platform_data;
  48        u32 timeout;
  49
  50        __raw_writel(0, pdata->base);
  51
  52        /* Wait max 1ms */
  53        timeout = 10;
  54        while (__raw_readl(pdata->base + 0x4) & S5P_INT_LOCAL_PWR_EN) {
  55                if (timeout == 0) {
  56                        printk(KERN_ERR "Power domain %s disable failed.\n",
  57                                dev_name(dev));
  58                        return -ETIMEDOUT;
  59                }
  60                timeout--;
  61                udelay(100);
  62        }
  63
  64        return 0;
  65}
  66
  67struct platform_device s5pv310_device_pd[] = {
  68        {
  69                .name           = "samsung-pd",
  70                .id             = 0,
  71                .dev = {
  72                        .platform_data = &(struct samsung_pd_info) {
  73                                .enable         = s5pv310_pd_enable,
  74                                .disable        = s5pv310_pd_disable,
  75                                .base           = S5P_PMU_MFC_CONF,
  76                        },
  77                },
  78        }, {
  79                .name           = "samsung-pd",
  80                .id             = 1,
  81                .dev = {
  82                        .platform_data = &(struct samsung_pd_info) {
  83                                .enable         = s5pv310_pd_enable,
  84                                .disable        = s5pv310_pd_disable,
  85                                .base           = S5P_PMU_G3D_CONF,
  86                        },
  87                },
  88        }, {
  89                .name           = "samsung-pd",
  90                .id             = 2,
  91                .dev = {
  92                        .platform_data = &(struct samsung_pd_info) {
  93                                .enable         = s5pv310_pd_enable,
  94                                .disable        = s5pv310_pd_disable,
  95                                .base           = S5P_PMU_LCD0_CONF,
  96                        },
  97                },
  98        }, {
  99                .name           = "samsung-pd",
 100                .id             = 3,
 101                .dev = {
 102                        .platform_data = &(struct samsung_pd_info) {
 103                                .enable         = s5pv310_pd_enable,
 104                                .disable        = s5pv310_pd_disable,
 105                                .base           = S5P_PMU_LCD1_CONF,
 106                        },
 107                },
 108        }, {
 109                .name           = "samsung-pd",
 110                .id             = 4,
 111                .dev = {
 112                        .platform_data = &(struct samsung_pd_info) {
 113                                .enable         = s5pv310_pd_enable,
 114                                .disable        = s5pv310_pd_disable,
 115                                .base           = S5P_PMU_TV_CONF,
 116                        },
 117                },
 118        }, {
 119                .name           = "samsung-pd",
 120                .id             = 5,
 121                .dev = {
 122                        .platform_data = &(struct samsung_pd_info) {
 123                                .enable         = s5pv310_pd_enable,
 124                                .disable        = s5pv310_pd_disable,
 125                                .base           = S5P_PMU_CAM_CONF,
 126                        },
 127                },
 128        }, {
 129                .name           = "samsung-pd",
 130                .id             = 6,
 131                .dev = {
 132                        .platform_data = &(struct samsung_pd_info) {
 133                                .enable         = s5pv310_pd_enable,
 134                                .disable        = s5pv310_pd_disable,
 135                                .base           = S5P_PMU_GPS_CONF,
 136                        },
 137                },
 138        },
 139};
 140