* [PATCH 1/3] ISL6271A voltage regulator support.
@ 2010-06-12 12:44 Marek Vasut
2010-06-12 12:44 ` [PATCH 2/3] ARM/scoop: Add CPR register bit definitions Marek Vasut
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Marek Vasut @ 2010-06-12 12:44 UTC (permalink / raw)
To: linux-arm-kernel
This device is very simple, it supports only one LDO. This single LDO is
programmed over I2C to 16 possible voltages.
Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
---
drivers/regulator/Kconfig | 6 +
drivers/regulator/Makefile | 1 +
drivers/regulator/isl6271a-regulator.c | 199 ++++++++++++++++++++++++++++++++
3 files changed, 206 insertions(+), 0 deletions(-)
create mode 100644 drivers/regulator/isl6271a-regulator.c
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 04f2e08..6772ca7 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -201,5 +201,11 @@ config REGULATOR_88PM8607
help
This driver supports 88PM8607 voltage regulator chips.
+config REGULATOR_ISL6271A
+ tristate "Intersil ISL6271A Power regulator"
+ depends on I2C
+ help
+ This driver supports ISL6271A voltage regulator chip.
+
endif
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
index 4e7feec..e2191bf 100644
--- a/drivers/regulator/Makefile
+++ b/drivers/regulator/Makefile
@@ -31,5 +31,6 @@ obj-$(CONFIG_REGULATOR_AB3100) += ab3100.o
obj-$(CONFIG_REGULATOR_TPS65023) += tps65023-regulator.o
obj-$(CONFIG_REGULATOR_TPS6507X) += tps6507x-regulator.o
obj-$(CONFIG_REGULATOR_88PM8607) += 88pm8607.o
+obj-$(CONFIG_REGULATOR_ISL6271A) += isl6271a-regulator.o
ccflags-$(CONFIG_REGULATOR_DEBUG) += -DDEBUG
diff --git a/drivers/regulator/isl6271a-regulator.c b/drivers/regulator/isl6271a-regulator.c
new file mode 100644
index 0000000..41cddc7
--- /dev/null
+++ b/drivers/regulator/isl6271a-regulator.c
@@ -0,0 +1,199 @@
+/*
+ * isl6271a-regulator.c
+ *
+ * Support for Intersil ISL6271A voltage regulator
+ *
+ * Copyright (C) 2010 Marek Vasut <marek.vasut@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation version 2.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,
+ * whether express or implied; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/err.h>
+#include <linux/platform_device.h>
+#include <linux/regulator/driver.h>
+#include <linux/i2c.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+
+/* Supported voltage values for regulators */
+static const u32 core_buck_table[] = {
+ 850000, 900000, 950000, 1000000,
+ 1050000, 1100000, 1150000, 1200000,
+ 1250000, 1300000, 1350000, 1400000,
+ 1450000, 1500000, 1550000, 1600000,
+};
+
+/* PMIC details */
+struct isl_pmic {
+ struct regulator_desc desc;
+ struct i2c_client *client;
+ struct regulator_dev *rdev;
+ struct mutex mtx;
+};
+
+static int isl6271a_get_voltage(struct regulator_dev *dev)
+{
+ struct isl_pmic *pmic = rdev_get_drvdata(dev);
+ int idx, data;
+
+ mutex_lock(&pmic->mtx);
+
+ idx = i2c_smbus_read_byte(pmic->client);
+ if (idx < 0) {
+ dev_err(&pmic->client->dev, "Error getting voltage\n");
+ data = idx;
+ goto out;
+ }
+
+ data = core_buck_table[idx & 0xf];
+
+out:
+ mutex_unlock(&pmic->mtx);
+ return data;
+}
+
+static int isl6271a_set_voltage(struct regulator_dev *dev, int minuV, int maxuV)
+{
+ struct isl_pmic *pmic = rdev_get_drvdata(dev);
+ int vsel, err;
+ int pmic_minuV = core_buck_table[0];
+ int pmic_maxuV = core_buck_table[ARRAY_SIZE(core_buck_table) - 1];
+
+ if (minuV < pmic_minuV || minuV > pmic_maxuV)
+ return -EINVAL;
+ if (maxuV < pmic_minuV || maxuV > pmic_maxuV)
+ return -EINVAL;
+
+ for (vsel = 0; vsel < ARRAY_SIZE(core_buck_table); vsel++) {
+ int uV = core_buck_table[vsel];
+
+ if (minuV <= uV && uV <= maxuV)
+ break;
+ }
+
+ if (vsel == ARRAY_SIZE(core_buck_table))
+ return -EINVAL;
+
+ mutex_lock(&pmic->mtx);
+
+ err = i2c_smbus_write_byte(pmic->client, vsel);
+ if (err < 0)
+ dev_err(&pmic->client->dev, "Error setting voltage\n");
+
+ mutex_unlock(&pmic->mtx);
+ return err;
+}
+
+static int isl6271a_list_voltage(struct regulator_dev *dev, unsigned selector)
+{
+ return core_buck_table[selector];
+}
+
+static struct regulator_ops isl_core_ops = {
+ .get_voltage = isl6271a_get_voltage,
+ .set_voltage = isl6271a_set_voltage,
+ .list_voltage = isl6271a_list_voltage,
+};
+
+static int __devinit isl6271a_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ struct regulator_init_data *init_data = client->dev.platform_data;
+ struct isl_pmic *pmic;
+ int err;
+
+ if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
+ return -EIO;
+
+ if (!init_data)
+ return -EIO;
+
+ pmic = kzalloc(sizeof(struct isl_pmic), GFP_KERNEL);
+ if (!pmic)
+ return -ENOMEM;
+
+ pmic->client = client;
+
+ mutex_init(&pmic->mtx);
+
+ pmic->desc.name = "Core Buck";
+ pmic->desc.id = 0;
+ pmic->desc.n_voltages = ARRAY_SIZE(core_buck_table);
+ pmic->desc.ops = &isl_core_ops;
+ pmic->desc.type = REGULATOR_VOLTAGE;
+ pmic->desc.owner = THIS_MODULE;
+
+ pmic->rdev = regulator_register(&pmic->desc, &client->dev,
+ init_data, pmic);
+ if (IS_ERR(pmic->rdev)) {
+ dev_err(&client->dev, "failed to register %s\n",
+ id->name);
+ err = PTR_ERR(pmic->rdev);
+ goto error;
+ }
+
+ i2c_set_clientdata(client, pmic);
+
+ return 0;
+
+error:
+ kfree(pmic);
+ return err;
+}
+
+static int __devexit isl6271a_remove(struct i2c_client *client)
+{
+ struct isl_pmic *pmic = i2c_get_clientdata(client);
+
+ i2c_set_clientdata(client, NULL);
+
+ regulator_unregister(pmic->rdev);
+
+ kfree(pmic);
+
+ return 0;
+}
+
+static const struct i2c_device_id isl6271a_id[] = {
+ {.name = "isl6271a", 0 },
+ { },
+};
+
+MODULE_DEVICE_TABLE(i2c, isl6271a_id);
+
+static struct i2c_driver isl6271a_i2c_driver = {
+ .driver = {
+ .name = "isl6271a",
+ .owner = THIS_MODULE,
+ },
+ .probe = isl6271a_probe,
+ .remove = __devexit_p(isl6271a_remove),
+ .id_table = isl6271a_id,
+};
+
+static int __init isl6271a_init(void)
+{
+ return i2c_add_driver(&isl6271a_i2c_driver);
+}
+
+static void __exit isl6271a_cleanup(void)
+{
+ i2c_del_driver(&isl6271a_i2c_driver);
+}
+
+subsys_initcall(isl6271a_init);
+module_exit(isl6271a_cleanup);
+
+MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>");
+MODULE_DESCRIPTION("Intersil ISL6271A voltage regulator driver");
+MODULE_LICENSE("GPL v2");
--
1.7.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/3] ARM/scoop: Add CPR register bit definitions
2010-06-12 12:44 [PATCH 1/3] ISL6271A voltage regulator support Marek Vasut
@ 2010-06-12 12:44 ` Marek Vasut
2010-06-12 12:44 ` [PATCH 3/3] pxa/spitz: Rework spitz Marek Vasut
2010-06-12 17:21 ` [PATCH 1/3] ISL6271A voltage regulator support Mark Brown
2 siblings, 0 replies; 6+ messages in thread
From: Marek Vasut @ 2010-06-12 12:44 UTC (permalink / raw)
To: linux-arm-kernel
Add bit definitions of the CPR register of the SCOOP chip into scoop.h. Also,
cleanup the GPCR definitions to match coding style.
Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
---
arch/arm/include/asm/hardware/scoop.h | 29 +++++++++++++++++------------
1 files changed, 17 insertions(+), 12 deletions(-)
diff --git a/arch/arm/include/asm/hardware/scoop.h b/arch/arm/include/asm/hardware/scoop.h
index 46492a6..ebb3cea 100644
--- a/arch/arm/include/asm/hardware/scoop.h
+++ b/arch/arm/include/asm/hardware/scoop.h
@@ -22,18 +22,23 @@
#define SCOOP_GPWR 0x24
#define SCOOP_GPRR 0x28
-#define SCOOP_GPCR_PA22 ( 1 << 12 )
-#define SCOOP_GPCR_PA21 ( 1 << 11 )
-#define SCOOP_GPCR_PA20 ( 1 << 10 )
-#define SCOOP_GPCR_PA19 ( 1 << 9 )
-#define SCOOP_GPCR_PA18 ( 1 << 8 )
-#define SCOOP_GPCR_PA17 ( 1 << 7 )
-#define SCOOP_GPCR_PA16 ( 1 << 6 )
-#define SCOOP_GPCR_PA15 ( 1 << 5 )
-#define SCOOP_GPCR_PA14 ( 1 << 4 )
-#define SCOOP_GPCR_PA13 ( 1 << 3 )
-#define SCOOP_GPCR_PA12 ( 1 << 2 )
-#define SCOOP_GPCR_PA11 ( 1 << 1 )
+#define SCOOP_CPR_OUT (1 << 7)
+#define SCOOP_CPR_SD_3V (1 << 2)
+#define SCOOP_CPR_CF_XV (1 << 1)
+#define SCOOP_CPR_CF_3V (1 << 0)
+
+#define SCOOP_GPCR_PA22 (1 << 12)
+#define SCOOP_GPCR_PA21 (1 << 11)
+#define SCOOP_GPCR_PA20 (1 << 10)
+#define SCOOP_GPCR_PA19 (1 << 9)
+#define SCOOP_GPCR_PA18 (1 << 8)
+#define SCOOP_GPCR_PA17 (1 << 7)
+#define SCOOP_GPCR_PA16 (1 << 6)
+#define SCOOP_GPCR_PA15 (1 << 5)
+#define SCOOP_GPCR_PA14 (1 << 4)
+#define SCOOP_GPCR_PA13 (1 << 3)
+#define SCOOP_GPCR_PA12 (1 << 2)
+#define SCOOP_GPCR_PA11 (1 << 1)
struct scoop_config {
unsigned short io_out;
--
1.7.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 3/3] pxa/spitz: Rework spitz
2010-06-12 12:44 [PATCH 1/3] ISL6271A voltage regulator support Marek Vasut
2010-06-12 12:44 ` [PATCH 2/3] ARM/scoop: Add CPR register bit definitions Marek Vasut
@ 2010-06-12 12:44 ` Marek Vasut
2010-06-12 17:21 ` [PATCH 1/3] ISL6271A voltage regulator support Mark Brown
2 siblings, 0 replies; 6+ messages in thread
From: Marek Vasut @ 2010-06-12 12:44 UTC (permalink / raw)
To: linux-arm-kernel
This huge patch mostly shuffles code. The spitz.c file contained terrible mess
and needed a cleanup, here it is:
1) Made every part modular, components are not built in if not selected.
2) Removed loads of preprocessor goo, mostly "#ifdef MACH_AKITA .... #endif" and
similar code. The kernel size will grow by a few kb now, but the file is much
more readable.
3) Reworked SD/CF power setting function and made it reentrant.
4) Add ISL6271A regulator support
5) Correctly register WM8750
Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
---
arch/arm/mach-pxa/include/mach/spitz.h | 2 -
arch/arm/mach-pxa/spitz.c | 810 ++++++++++++++++++-------------
2 files changed, 470 insertions(+), 342 deletions(-)
diff --git a/arch/arm/mach-pxa/include/mach/spitz.h b/arch/arm/mach-pxa/include/mach/spitz.h
index fa1998c..685749a 100644
--- a/arch/arm/mach-pxa/include/mach/spitz.h
+++ b/arch/arm/mach-pxa/include/mach/spitz.h
@@ -185,7 +185,5 @@
/*
* Shared data structures
*/
-extern struct platform_device spitzscoop_device;
-extern struct platform_device spitzscoop2_device;
extern struct platform_device spitzssp_device;
extern struct sharpsl_charger_machinfo spitz_pm_machinfo;
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c
index 4d2413e..fa31980 100644
--- a/arch/arm/mach-pxa/spitz.c
+++ b/arch/arm/mach-pxa/spitz.c
@@ -18,14 +18,15 @@
#include <linux/gpio_keys.h>
#include <linux/gpio.h>
#include <linux/leds.h>
-#include <linux/mtd/physmap.h>
#include <linux/i2c.h>
#include <linux/i2c/pca953x.h>
#include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <linux/spi/corgi_lcd.h>
+#include <linux/mtd/physmap.h>
#include <linux/mtd/sharpsl.h>
#include <linux/input/matrix_keypad.h>
+#include <linux/regulator/machine.h>
#include <asm/setup.h>
#include <asm/mach-types.h>
@@ -33,11 +34,9 @@
#include <asm/mach/sharpsl_param.h>
#include <asm/hardware/scoop.h>
-
#include <mach/pxa27x.h>
#include <mach/pxa27x-udc.h>
#include <mach/reset.h>
-#include <plat/i2c.h>
#include <mach/irda.h>
#include <mach/mmc.h>
#include <mach/ohci.h>
@@ -45,11 +44,16 @@
#include <mach/pxa2xx_spi.h>
#include <mach/spitz.h>
+#include <plat/i2c.h>
+
#include "generic.h"
#include "devices.h"
#include "sharpsl.h"
-static unsigned long spitz_pin_config[] __initdata = {
+/******************************************************************************
+ * Pin configuration
+ ******************************************************************************/
+static unsigned long sharpslc_pin_config[] __initdata = {
/* Chip Selects */
GPIO78_nCS_2, /* SCOOP #2 */
GPIO79_nCS_3, /* NAND */
@@ -124,10 +128,13 @@ static unsigned long spitz_pin_config[] __initdata = {
GPIO1_GPIO | WAKEUP_ON_EDGE_FALL, /* SPITZ_GPIO_RESET */
};
-/*
- * Spitz SCOOP Device #1
- */
-static struct resource spitz_scoop_resources[] = {
+
+/******************************************************************************
+ * Scoop GPIO expander
+ ******************************************************************************/
+#if defined(CONFIG_SHARP_SCOOP) || defined(CONFIG_SHARP_SCOOP_MODULE)
+/* SCOOP Device #1 */
+static struct resource sharpslc_scoop_1_resources[] = {
[0] = {
.start = 0x10800000,
.end = 0x10800fff,
@@ -135,7 +142,7 @@ static struct resource spitz_scoop_resources[] = {
},
};
-static struct scoop_config spitz_scoop_setup = {
+static struct scoop_config sharpslc_scoop_1_setup = {
.io_dir = SPITZ_SCP_IO_DIR,
.io_out = SPITZ_SCP_IO_OUT,
.suspend_clr = SPITZ_SCP_SUS_CLR,
@@ -143,20 +150,18 @@ static struct scoop_config spitz_scoop_setup = {
.gpio_base = SPITZ_SCP_GPIO_BASE,
};
-struct platform_device spitzscoop_device = {
+struct platform_device sharpslc_scoop_1_device = {
.name = "sharp-scoop",
.id = 0,
.dev = {
- .platform_data = &spitz_scoop_setup,
+ .platform_data = &sharpslc_scoop_1_setup,
},
- .num_resources = ARRAY_SIZE(spitz_scoop_resources),
- .resource = spitz_scoop_resources,
+ .num_resources = ARRAY_SIZE(sharpslc_scoop_1_resources),
+ .resource = sharpslc_scoop_1_resources,
};
-/*
- * Spitz SCOOP Device #2
- */
-static struct resource spitz_scoop2_resources[] = {
+/* SCOOP Device #2 */
+static struct resource sharpslc_scoop_2_resources[] = {
[0] = {
.start = 0x08800040,
.end = 0x08800fff,
@@ -164,7 +169,7 @@ static struct resource spitz_scoop2_resources[] = {
},
};
-static struct scoop_config spitz_scoop2_setup = {
+static struct scoop_config sharpslc_scoop_2_setup = {
.io_dir = SPITZ_SCP2_IO_DIR,
.io_out = SPITZ_SCP2_IO_OUT,
.suspend_clr = SPITZ_SCP2_SUS_CLR,
@@ -172,82 +177,110 @@ static struct scoop_config spitz_scoop2_setup = {
.gpio_base = SPITZ_SCP2_GPIO_BASE,
};
-struct platform_device spitzscoop2_device = {
+struct platform_device sharpslc_scoop_2_device = {
.name = "sharp-scoop",
.id = 1,
.dev = {
- .platform_data = &spitz_scoop2_setup,
+ .platform_data = &sharpslc_scoop_2_setup,
},
- .num_resources = ARRAY_SIZE(spitz_scoop2_resources),
- .resource = spitz_scoop2_resources,
+ .num_resources = ARRAY_SIZE(sharpslc_scoop_2_resources),
+ .resource = sharpslc_scoop_2_resources,
};
-#define SPITZ_PWR_SD 0x01
-#define SPITZ_PWR_CF 0x02
+static void __init sharpslc_scoop_init(void)
+{
+ platform_device_register(&sharpslc_scoop_1_device);
+
+ /* Akita doesn't have the second SCOOP chip */
+ if (!machine_is_akita())
+ platform_device_register(&sharpslc_scoop_2_device);
+}
/* Power control is shared with between one of the CF slots and SD */
-static void spitz_card_pwr_ctrl(int device, unsigned short new_cpr)
+static void sharpslc_card_pwr_ctrl(uint8_t enable, uint8_t new_cpr)
{
- unsigned short cpr = read_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR);
+ unsigned short cpr;
+ unsigned long flags;
- if (new_cpr & 0x0007) {
+ if (new_cpr & 0x7) {
gpio_set_value(SPITZ_GPIO_CF_POWER, 1);
- if (!(cpr & 0x0002) && !(cpr & 0x0004))
- mdelay(5);
- if (device == SPITZ_PWR_CF)
- cpr |= 0x0002;
- if (device == SPITZ_PWR_SD)
- cpr |= 0x0004;
- write_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR, cpr | new_cpr);
- } else {
- if (device == SPITZ_PWR_CF)
- cpr &= ~0x0002;
- if (device == SPITZ_PWR_SD)
- cpr &= ~0x0004;
- if (!(cpr & 0x0002) && !(cpr & 0x0004)) {
- write_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR, 0x0000);
- mdelay(1);
- gpio_set_value(SPITZ_GPIO_CF_POWER, 0);
- } else {
- write_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR, cpr | new_cpr);
- }
+ mdelay(5);
+ }
+
+ local_irq_save(flags);
+
+ cpr = read_scoop_reg(&sharpslc_scoop_1_device.dev, SCOOP_CPR);
+
+ if (enable & new_cpr)
+ cpr |= new_cpr;
+ else
+ cpr &= ~enable;
+
+ write_scoop_reg(&sharpslc_scoop_1_device.dev, SCOOP_CPR, cpr);
+
+ local_irq_restore(flags);
+
+ if (!(cpr & 0x7)) {
+ mdelay(1);
+ gpio_set_value(SPITZ_GPIO_CF_POWER, 0);
}
}
-static void spitz_pcmcia_pwr(struct device *scoop, unsigned short cpr, int nr)
+#else
+static inline void sharpslc_scoop_init(void) {}
+static inline void sharpslc_card_pwr_ctrl(uint8_t enable, uint8_t new_cpr) {}
+#endif
+
+/******************************************************************************
+ * PCMCIA
+ ******************************************************************************/
+#if defined(CONFIG_PCMCIA_PXA2XX) || defined(CONFIG_PCMCIA_PXA2XX_MODULE)
+static void sharpslc_pcmcia_pwr(struct device *scoop, uint16_t cpr, int nr)
{
/* Only need to override behaviour for slot 0 */
if (nr == 0)
- spitz_card_pwr_ctrl(SPITZ_PWR_CF, cpr);
+ sharpslc_card_pwr_ctrl(
+ cpr & (SCOOP_CPR_CF_3V | SCOOP_CPR_CF_XV), cpr);
else
write_scoop_reg(scoop, SCOOP_CPR, cpr);
}
-static struct scoop_pcmcia_dev spitz_pcmcia_scoop[] = {
-{
- .dev = &spitzscoop_device.dev,
- .irq = SPITZ_IRQ_GPIO_CF_IRQ,
- .cd_irq = SPITZ_IRQ_GPIO_CF_CD,
- .cd_irq_str = "PCMCIA0 CD",
-},{
- .dev = &spitzscoop2_device.dev,
- .irq = SPITZ_IRQ_GPIO_CF2_IRQ,
- .cd_irq = -1,
-},
+static struct scoop_pcmcia_dev sharpslc_pcmcia_scoop[] = {
+ {
+ .dev = &sharpslc_scoop_1_device.dev,
+ .irq = SPITZ_IRQ_GPIO_CF_IRQ,
+ .cd_irq = SPITZ_IRQ_GPIO_CF_CD,
+ .cd_irq_str = "PCMCIA0 CD",
+ }, {
+ .dev = &sharpslc_scoop_2_device.dev,
+ .irq = SPITZ_IRQ_GPIO_CF2_IRQ,
+ .cd_irq = -1,
+ },
};
-static struct scoop_pcmcia_config spitz_pcmcia_config = {
- .devs = &spitz_pcmcia_scoop[0],
- .num_devs = 2,
- .power_ctrl = spitz_pcmcia_pwr,
+static struct scoop_pcmcia_config sharpslc_pcmcia_config = {
+ .devs = &sharpslc_pcmcia_scoop[0],
+ .num_devs = 2,
+ .power_ctrl = sharpslc_pcmcia_pwr,
};
-EXPORT_SYMBOL(spitzscoop_device);
-EXPORT_SYMBOL(spitzscoop2_device);
+static void __init sharpslc_pcmcia_init(void)
+{
+ /* Akita has only one PCMCIA slot used */
+ if (machine_is_akita())
+ sharpslc_pcmcia_config.num_devs = 1;
+
+ platform_scoop_config = &sharpslc_pcmcia_config;
+}
+#else
+static inline void sharpslc_pcmcia_init(void) {}
+#endif
+
+/******************************************************************************
+ * GPIO keyboard
+ ******************************************************************************/
+#if defined(CONFIG_KEYBOARD_MATRIX) || defined(CONFIG_KEYBOARD_MATRIX_MODULE)
-/*
- * Spitz Keyboard Device
- */
#define SPITZ_KEY_CALENDAR KEY_F1
#define SPITZ_KEY_ADDRESS KEY_F2
#define SPITZ_KEY_FN KEY_F3
@@ -263,7 +296,7 @@ EXPORT_SYMBOL(spitzscoop2_device);
#define SPITZ_KEY_OK KEY_F11
#define SPITZ_KEY_MENU KEY_F12
-static const uint32_t spitzkbd_keymap[] = {
+static const uint32_t sharpslc_keymap[] = {
KEY(0, 0, KEY_LEFTCTRL),
KEY(0, 1, KEY_1),
KEY(0, 2, KEY_3),
@@ -330,37 +363,48 @@ static const uint32_t spitzkbd_keymap[] = {
KEY(6, 8, KEY_RIGHT),
};
-static const struct matrix_keymap_data spitzkbd_keymap_data = {
- .keymap = spitzkbd_keymap,
- .keymap_size = ARRAY_SIZE(spitzkbd_keymap),
+static const struct matrix_keymap_data sharpslc_keymap_data = {
+ .keymap = sharpslc_keymap,
+ .keymap_size = ARRAY_SIZE(sharpslc_keymap),
};
-static const uint32_t spitzkbd_row_gpios[] =
+static const uint32_t sharpslc_row_gpios[] =
{ 12, 17, 91, 34, 36, 38, 39 };
-static const uint32_t spitzkbd_col_gpios[] =
+static const uint32_t sharpslc_col_gpios[] =
{ 88, 23, 24, 25, 26, 27, 52, 103, 107, 108, 114 };
-static struct matrix_keypad_platform_data spitzkbd_pdata = {
- .keymap_data = &spitzkbd_keymap_data,
- .row_gpios = spitzkbd_row_gpios,
- .col_gpios = spitzkbd_col_gpios,
- .num_row_gpios = ARRAY_SIZE(spitzkbd_row_gpios),
- .num_col_gpios = ARRAY_SIZE(spitzkbd_col_gpios),
+static struct matrix_keypad_platform_data sharpslc_mkp_pdata = {
+ .keymap_data = &sharpslc_keymap_data,
+ .row_gpios = sharpslc_row_gpios,
+ .col_gpios = sharpslc_col_gpios,
+ .num_row_gpios = ARRAY_SIZE(sharpslc_row_gpios),
+ .num_col_gpios = ARRAY_SIZE(sharpslc_col_gpios),
.col_scan_delay_us = 10,
.debounce_ms = 10,
.wakeup = 1,
};
-static struct platform_device spitzkbd_device = {
+static struct platform_device sharpslc_mkp_device = {
.name = "matrix-keypad",
.id = -1,
.dev = {
- .platform_data = &spitzkbd_pdata,
+ .platform_data = &sharpslc_mkp_pdata,
},
};
+static void __init sharpslc_mkp_init(void)
+{
+ platform_device_register(&sharpslc_mkp_device);
+}
+#else
+static inline void sharpslc_mkp_init(void) {}
+#endif
-static struct gpio_keys_button spitz_gpio_keys[] = {
+/******************************************************************************
+ * GPIO keys
+ ******************************************************************************/
+#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
+static struct gpio_keys_button sharpslc_gpio_keys[] = {
{
.type = EV_PWR,
.code = KEY_SUSPEND,
@@ -383,27 +427,35 @@ static struct gpio_keys_button spitz_gpio_keys[] = {
},
};
-static struct gpio_keys_platform_data spitz_gpio_keys_platform_data = {
- .buttons = spitz_gpio_keys,
- .nbuttons = ARRAY_SIZE(spitz_gpio_keys),
+static struct gpio_keys_platform_data sharpslc_gpio_keys_platform_data = {
+ .buttons = sharpslc_gpio_keys,
+ .nbuttons = ARRAY_SIZE(sharpslc_gpio_keys),
};
-static struct platform_device spitz_gpio_keys_device = {
+static struct platform_device sharpslc_gpio_keys_device = {
.name = "gpio-keys",
.id = -1,
.dev = {
- .platform_data = &spitz_gpio_keys_platform_data,
+ .platform_data = &sharpslc_gpio_keys_platform_data,
},
};
+static void __init sharpslc_keys_init(void)
+{
+ platform_device_register(&sharpslc_gpio_keys_device);
+}
+#else
+static inline void sharpslc_keys_init(void) {}
+#endif
-/*
- * Spitz LEDs
- */
-static struct gpio_led spitz_gpio_leds[] = {
+/******************************************************************************
+ * LEDs
+ ******************************************************************************/
+#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
+static struct gpio_led sharpslc_gpio_leds[] = {
{
.name = "spitz:amber:charge",
- .default_trigger = "sharpsl-charge",
+ .default_trigger = "sharpslc-charge",
.gpio = SPITZ_GPIO_LED_ORANGE,
},
{
@@ -413,25 +465,32 @@ static struct gpio_led spitz_gpio_leds[] = {
},
};
-static struct gpio_led_platform_data spitz_gpio_leds_info = {
- .leds = spitz_gpio_leds,
- .num_leds = ARRAY_SIZE(spitz_gpio_leds),
+static struct gpio_led_platform_data sharpslc_gpio_leds_info = {
+ .leds = sharpslc_gpio_leds,
+ .num_leds = ARRAY_SIZE(sharpslc_gpio_leds),
};
-static struct platform_device spitzled_device = {
+static struct platform_device sharpslc_led_device = {
.name = "leds-gpio",
.id = -1,
.dev = {
- .platform_data = &spitz_gpio_leds_info,
+ .platform_data = &sharpslc_gpio_leds_info,
},
};
-#if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
-static struct pxa2xx_spi_master spitz_spi_info = {
- .num_chipselect = 3,
-};
+static void __init sharpslc_leds_init(void)
+{
+ platform_device_register(&sharpslc_led_device);
+}
+#else
+static inline void sharpslc_leds_init(void) {}
+#endif
-static void spitz_wait_for_hsync(void)
+/******************************************************************************
+ * SSP Devices
+ ******************************************************************************/
+#if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
+static void sharpslc_ads7846_wait_for_hsync(void)
{
while (gpio_get_value(SPITZ_GPIO_HSYNC))
cpu_relax();
@@ -440,21 +499,21 @@ static void spitz_wait_for_hsync(void)
cpu_relax();
}
-static struct ads7846_platform_data spitz_ads7846_info = {
+static struct ads7846_platform_data sharpslc_ads7846_info = {
.model = 7846,
.vref_delay_usecs = 100,
.x_plate_ohms = 419,
.y_plate_ohms = 486,
.pressure_max = 1024,
.gpio_pendown = SPITZ_GPIO_TP_INT,
- .wait_for_sync = spitz_wait_for_hsync,
+ .wait_for_sync = sharpslc_ads7846_wait_for_hsync,
};
-static struct pxa2xx_spi_chip spitz_ads7846_chip = {
+static struct pxa2xx_spi_chip sharpslc_ads7846_chip = {
.gpio_cs = SPITZ_GPIO_ADS7846_CS,
};
-static void spitz_bl_kick_battery(void)
+static void sharpslc_bl_kick_battery(void)
{
void (*kick_batt)(void);
@@ -465,93 +524,109 @@ static void spitz_bl_kick_battery(void)
}
}
-static struct corgi_lcd_platform_data spitz_lcdcon_info = {
+static struct corgi_lcd_platform_data sharpslc_lcdcon_info = {
.init_mode = CORGI_LCD_MODE_VGA,
.max_intensity = 0x2f,
.default_intensity = 0x1f,
.limit_mask = 0x0b,
.gpio_backlight_cont = SPITZ_GPIO_BACKLIGHT_CONT,
.gpio_backlight_on = SPITZ_GPIO_BACKLIGHT_ON,
- .kick_battery = spitz_bl_kick_battery,
+ .kick_battery = sharpslc_bl_kick_battery,
};
-static struct pxa2xx_spi_chip spitz_lcdcon_chip = {
+static struct pxa2xx_spi_chip sharpslc_lcdcon_chip = {
.gpio_cs = SPITZ_GPIO_LCDCON_CS,
};
-static struct pxa2xx_spi_chip spitz_max1111_chip = {
+static struct pxa2xx_spi_chip sharpslc_max1111_chip = {
.gpio_cs = SPITZ_GPIO_MAX1111_CS,
};
-static struct spi_board_info spitz_spi_devices[] = {
+static struct spi_board_info sharpslc_spi_devices[] = {
{
- .modalias = "ads7846",
- .max_speed_hz = 1200000,
- .bus_num = 2,
- .chip_select = 0,
- .platform_data = &spitz_ads7846_info,
- .controller_data= &spitz_ads7846_chip,
- .irq = gpio_to_irq(SPITZ_GPIO_TP_INT),
+ .modalias = "ads7846",
+ .max_speed_hz = 1200000,
+ .bus_num = 2,
+ .chip_select = 0,
+ .platform_data = &sharpslc_ads7846_info,
+ .controller_data = &sharpslc_ads7846_chip,
+ .irq = gpio_to_irq(SPITZ_GPIO_TP_INT),
}, {
- .modalias = "corgi-lcd",
- .max_speed_hz = 50000,
- .bus_num = 2,
- .chip_select = 1,
- .platform_data = &spitz_lcdcon_info,
- .controller_data= &spitz_lcdcon_chip,
+ .modalias = "corgi-lcd",
+ .max_speed_hz = 50000,
+ .bus_num = 2,
+ .chip_select = 1,
+ .platform_data = &sharpslc_lcdcon_info,
+ .controller_data = &sharpslc_lcdcon_chip,
}, {
- .modalias = "max1111",
- .max_speed_hz = 450000,
- .bus_num = 2,
- .chip_select = 2,
- .controller_data= &spitz_max1111_chip,
+ .modalias = "max1111",
+ .max_speed_hz = 450000,
+ .bus_num = 2,
+ .chip_select = 2,
+ .controller_data = &sharpslc_max1111_chip,
},
};
-static void __init spitz_init_spi(void)
+static struct pxa2xx_spi_master sharpslc_spi_info = {
+ .num_chipselect = 3,
+};
+
+static void __init sharpslc_spi_init(void)
{
+ struct corgi_lcd_platform_data *lcd_data = &sharpslc_lcdcon_info;
+
if (machine_is_akita()) {
- spitz_lcdcon_info.gpio_backlight_cont = AKITA_GPIO_BACKLIGHT_CONT;
- spitz_lcdcon_info.gpio_backlight_on = AKITA_GPIO_BACKLIGHT_ON;
+ lcd_data->gpio_backlight_cont = AKITA_GPIO_BACKLIGHT_CONT;
+ lcd_data->gpio_backlight_on = AKITA_GPIO_BACKLIGHT_ON;
}
- pxa2xx_set_spi_info(2, &spitz_spi_info);
- spi_register_board_info(ARRAY_AND_SIZE(spitz_spi_devices));
+ pxa2xx_set_spi_info(2, &sharpslc_spi_info);
+ spi_register_board_info(ARRAY_AND_SIZE(sharpslc_spi_devices));
}
#else
-static inline void spitz_init_spi(void) {}
+static inline void sharpslc_spi_init(void) {}
#endif
+/******************************************************************************
+ * SD/MMC card controller
+ ******************************************************************************/
+#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
/*
- * MMC/SD Device
- *
- * The card detect interrupt isn't debounced so we delay it by 250ms
- * to give the card a chance to fully insert/eject.
+ * NOTE: The card detect interrupt isn't debounced so we delay it by 250ms to
+ * give the card a chance to fully insert/eject.
*/
-static void spitz_mci_setpower(struct device *dev, unsigned int vdd)
+static void sharpslc_mci_setpower(struct device *dev, unsigned int vdd)
{
struct pxamci_platform_data* p_d = dev->platform_data;
- if (( 1 << vdd) & p_d->ocr_mask)
- spitz_card_pwr_ctrl(SPITZ_PWR_SD, 0x0004);
+ if ((1 << vdd) & p_d->ocr_mask)
+ sharpslc_card_pwr_ctrl(SCOOP_CPR_SD_3V, SCOOP_CPR_SD_3V);
else
- spitz_card_pwr_ctrl(SPITZ_PWR_SD, 0x0000);
+ sharpslc_card_pwr_ctrl(SCOOP_CPR_SD_3V, 0x0);
}
-static struct pxamci_platform_data spitz_mci_platform_data = {
+static struct pxamci_platform_data sharpslc_mci_platform_data = {
.detect_delay_ms = 250,
.ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
- .setpower = spitz_mci_setpower,
+ .setpower = sharpslc_mci_setpower,
.gpio_card_detect = SPITZ_GPIO_nSD_DETECT,
.gpio_card_ro = SPITZ_GPIO_nSD_WP,
.gpio_power = -1,
};
+static void __init sharpslc_mmc_init(void)
+{
+ pxa_set_mci_info(&sharpslc_mci_platform_data);
+}
+#else
+static inline void sharpslc_mmc_init(void) {}
+#endif
-/*
- * USB Host (OHCI)
- */
-static int spitz_ohci_init(struct device *dev)
+/******************************************************************************
+ * USB Host
+ ******************************************************************************/
+#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
+static int sharpslc_ohci_init(struct device *dev)
{
int err;
@@ -559,88 +634,114 @@ static int spitz_ohci_init(struct device *dev)
if (err)
return err;
- /* Only Port 2 is connected
- * Setup USB Port 2 Output Control Register
- */
+ /* Only Port 2 is connected, setup USB Port 2 Output Control Register */
UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE;
return gpio_direction_output(SPITZ_GPIO_USB_HOST, 1);
}
-static void spitz_ohci_exit(struct device *dev)
+static void sharpslc_ohci_exit(struct device *dev)
{
gpio_free(SPITZ_GPIO_USB_HOST);
}
-static struct pxaohci_platform_data spitz_ohci_platform_data = {
+static struct pxaohci_platform_data sharpslc_ohci_platform_data = {
.port_mode = PMM_NPS_MODE,
- .init = spitz_ohci_init,
- .exit = spitz_ohci_exit,
+ .init = sharpslc_ohci_init,
+ .exit = sharpslc_ohci_exit,
.flags = ENABLE_PORT_ALL | NO_OC_PROTECTION,
.power_budget = 150,
};
+static void __init sharpslc_uhc_init(void)
+{
+ pxa_set_ohci_info(&sharpslc_ohci_platform_data);
+}
+#else
+static inline void sharpslc_uhc_init(void) {}
+#endif
-/*
- * Irda
- */
-
-static struct pxaficp_platform_data spitz_ficp_platform_data = {
-/* .gpio_pwdown is set in spitz_init() and akita_init() accordingly */
+/******************************************************************************
+ * IrDA
+ ******************************************************************************/
+#if defined(CONFIG_PXA_FICP) || defined(CONFIG_PXA_FICP_MODULE)
+static struct pxaficp_platform_data sharpslc_ficp_platform_data = {
.transceiver_cap = IR_SIRMODE | IR_OFF,
};
+static void __init sharpslc_irda_init(void)
+{
+ if (machine_is_akita())
+ sharpslc_ficp_platform_data.gpio_pwdown = AKITA_GPIO_IR_ON;
+ else
+ sharpslc_ficp_platform_data.gpio_pwdown = SPITZ_GPIO_IR_ON;
-/*
- * Spitz PXA Framebuffer
- */
+ pxa_set_ficp_info(&sharpslc_ficp_platform_data);
+}
+#else
+static inline void sharpslc_irda_init(void) {}
+#endif
-static struct pxafb_mode_info spitz_pxafb_modes[] = {
-{
- .pixclock = 19231,
- .xres = 480,
- .yres = 640,
- .bpp = 16,
- .hsync_len = 40,
- .left_margin = 46,
- .right_margin = 125,
- .vsync_len = 3,
- .upper_margin = 1,
- .lower_margin = 0,
- .sync = 0,
-},{
- .pixclock = 134617,
- .xres = 240,
- .yres = 320,
- .bpp = 16,
- .hsync_len = 20,
- .left_margin = 20,
- .right_margin = 46,
- .vsync_len = 2,
- .upper_margin = 1,
- .lower_margin = 0,
- .sync = 0,
-},
-};
-
-static struct pxafb_mach_info spitz_pxafb_info = {
- .modes = &spitz_pxafb_modes[0],
- .num_modes = 2,
+/******************************************************************************
+ * Framebuffer
+ ******************************************************************************/
+#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
+static struct pxafb_mode_info sharpslc_pxafb_modes[] = {
+ {
+ .pixclock = 19231,
+ .xres = 480,
+ .yres = 640,
+ .bpp = 16,
+ .hsync_len = 40,
+ .left_margin = 46,
+ .right_margin = 125,
+ .vsync_len = 3,
+ .upper_margin = 1,
+ .lower_margin = 0,
+ .sync = 0,
+ }, {
+ .pixclock = 134617,
+ .xres = 240,
+ .yres = 320,
+ .bpp = 16,
+ .hsync_len = 20,
+ .left_margin = 20,
+ .right_margin = 46,
+ .vsync_len = 2,
+ .upper_margin = 1,
+ .lower_margin = 0,
+ .sync = 0,
+ },
+};
+
+static struct pxafb_mach_info sharpslc_pxafb_info = {
+ .modes = sharpslc_pxafb_modes,
+ .num_modes = ARRAY_SIZE(sharpslc_pxafb_modes),
.fixed_modes = 1,
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_ALTERNATE_MAPPING,
};
-static struct mtd_partition sharpsl_nand_partitions[] = {
+static void __init sharpslc_lcd_init(void)
+{
+ set_pxa_fb_info(&sharpslc_pxafb_info);
+}
+#else
+static inline void sharpslc_lcd_init(void) {}
+#endif
+
+/******************************************************************************
+ * Framebuffer
+ ******************************************************************************/
+#if defined(CONFIG_MTD_NAND_SHARPSL) || defined(CONFIG_MTD_NAND_SHARPSL_MODULE)
+static struct mtd_partition sharpslc_nand_partitions[] = {
{
.name = "System Area",
.offset = 0,
.size = 7 * 1024 * 1024,
- },
- {
+ }, {
.name = "Root Filesystem",
.offset = 7 * 1024 * 1024,
- },
- {
+ }, {
.name = "Home Filesystem",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
@@ -649,37 +750,72 @@ static struct mtd_partition sharpsl_nand_partitions[] = {
static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
-static struct nand_bbt_descr sharpsl_bbt = {
- .options = 0,
- .offs = 4,
- .len = 2,
- .pattern = scan_ff_pattern
+static struct nand_bbt_descr sharpslc_nand_bbt = {
+ .options = 0,
+ .offs = 4,
+ .len = 2,
+ .pattern = scan_ff_pattern
+};
+
+static struct nand_ecclayout sharpslc_akita_oobinfo = {
+ .oobfree = { {0x08, 0x09} },
+ .eccbytes = 24,
+ .eccpos = {
+ 0x05, 0x01, 0x02, 0x03, 0x06, 0x07, 0x15, 0x11,
+ 0x12, 0x13, 0x16, 0x17, 0x25, 0x21, 0x22, 0x23,
+ 0x26, 0x27, 0x35, 0x31, 0x32, 0x33, 0x36, 0x37,
+ },
};
-static struct sharpsl_nand_platform_data sharpsl_nand_platform_data = {
- .badblock_pattern = &sharpsl_bbt,
- .partitions = sharpsl_nand_partitions,
- .nr_partitions = ARRAY_SIZE(sharpsl_nand_partitions),
+static struct sharpsl_nand_platform_data sharpslc_nand_pdata = {
+ .badblock_pattern = &sharpslc_nand_bbt,
+ .partitions = sharpslc_nand_partitions,
+ .nr_partitions = ARRAY_SIZE(sharpslc_nand_partitions),
};
-static struct resource sharpsl_nand_resources[] = {
+static struct resource sharpslc_nand_resources[] = {
{
- .start = 0x0C000000,
- .end = 0x0C000FFF,
+ .start = PXA_CS3_PHYS,
+ .end = PXA_CS3_PHYS + SZ_4K - 1,
.flags = IORESOURCE_MEM,
},
};
-static struct platform_device sharpsl_nand_device = {
+static struct platform_device sharpslc_nand_device = {
.name = "sharpsl-nand",
.id = -1,
- .resource = sharpsl_nand_resources,
- .num_resources = ARRAY_SIZE(sharpsl_nand_resources),
- .dev.platform_data = &sharpsl_nand_platform_data,
+ .resource = sharpslc_nand_resources,
+ .num_resources = ARRAY_SIZE(sharpslc_nand_resources),
+ .dev = {
+ .platform_data = &sharpslc_nand_pdata,
+ }
};
+static void __init sharpslc_nand_init(void)
+{
+ if (machine_is_spitz()) {
+ sharpslc_nand_partitions[1].size = 5 * 1024 * 1024;
+ } else if (machine_is_akita()) {
+ sharpslc_nand_partitions[1].size = 58 * 1024 * 1024;
+ sharpslc_nand_bbt.len = 1;
+ sharpslc_nand_pdata.ecc_layout = &sharpslc_akita_oobinfo;
+ } else if (machine_is_borzoi()) {
+ sharpslc_nand_partitions[1].size = 32 * 1024 * 1024;
+ sharpslc_nand_bbt.len = 1;
+ sharpslc_nand_pdata.ecc_layout = &sharpslc_akita_oobinfo;
+ }
+
+ platform_device_register(&sharpslc_nand_device);
+}
+#else
+static inline void sharpslc_nand_init(void) {}
+#endif
-static struct mtd_partition sharpsl_rom_parts[] = {
+/******************************************************************************
+ * NOR Flash
+ ******************************************************************************/
+#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
+static struct mtd_partition sharpslc_rom_parts[] = {
{
.name ="Boot PROM Filesystem",
.offset = 0x00140000,
@@ -687,158 +823,152 @@ static struct mtd_partition sharpsl_rom_parts[] = {
},
};
-static struct physmap_flash_data sharpsl_rom_data = {
+static struct physmap_flash_data sharpslc_rom_data = {
.width = 2,
- .nr_parts = ARRAY_SIZE(sharpsl_rom_parts),
- .parts = sharpsl_rom_parts,
+ .nr_parts = ARRAY_SIZE(sharpslc_rom_parts),
+ .parts = sharpslc_rom_parts,
};
-static struct resource sharpsl_rom_resources[] = {
+static struct resource sharpslc_rom_resources[] = {
{
- .start = 0x00000000,
- .end = 0x007fffff,
+ .start = PXA_CS0_PHYS,
+ .end = PXA_CS0_PHYS + SZ_8M - 1,
.flags = IORESOURCE_MEM,
},
};
-static struct platform_device sharpsl_rom_device = {
- .name = "physmap-flash",
- .id = -1,
- .resource = sharpsl_rom_resources,
- .num_resources = ARRAY_SIZE(sharpsl_rom_resources),
- .dev.platform_data = &sharpsl_rom_data,
-};
-
-static struct platform_device *devices[] __initdata = {
- &spitzscoop_device,
- &spitzkbd_device,
- &spitz_gpio_keys_device,
- &spitzled_device,
- &sharpsl_nand_device,
- &sharpsl_rom_device,
+static struct platform_device sharpslc_rom_device = {
+ .name = "physmap-flash",
+ .id = -1,
+ .resource = sharpslc_rom_resources,
+ .num_resources = ARRAY_SIZE(sharpslc_rom_resources),
+ .dev = {
+ .platform_data = &sharpslc_rom_data,
+ },
};
-static void spitz_poweroff(void)
+static void __init sharpslc_nor_init(void)
{
- arm_machine_restart('g', NULL);
+ platform_device_register(&sharpslc_rom_device);
}
+#else
+static inline void sharpslc_nor_init(void) {}
+#endif
-static void spitz_restart(char mode, const char *cmd)
-{
- /* Bootloader magic for a reboot */
- if((MSC0 & 0xffff0000) == 0x7ff00000)
- MSC0 = (MSC0 & 0xffff) | 0x7ee00000;
-
- spitz_poweroff();
-}
+/******************************************************************************
+ * GPIO expander
+ ******************************************************************************/
+#if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
+static struct pca953x_platform_data akita_pca953x_pdata = {
+ .gpio_base = AKITA_IOEXP_GPIO_BASE,
+};
-static void __init common_init(void)
-{
- init_gpio_reset(SPITZ_GPIO_ON_RESET, 1, 0);
- pm_power_off = spitz_poweroff;
- arm_pm_restart = spitz_restart;
+static struct i2c_board_info sharpslc_i2c_devs[] = {
+ {
+ .type = "wm8750",
+ .addr = 0x1b,
+ }, {
+ .type = "max7310",
+ .addr = 0x18,
+ .platform_data = &akita_pca953x_pdata,
+ },
+};
- if (machine_is_spitz()) {
- sharpsl_nand_partitions[1].size = 5 * 1024 * 1024;
- } else if (machine_is_akita()) {
- sharpsl_nand_partitions[1].size = 58 * 1024 * 1024;
- } else if (machine_is_borzoi()) {
- sharpsl_nand_partitions[1].size = 32 * 1024 * 1024;
+static struct regulator_consumer_supply isl6271a_consumers[] = {
+ {
+ .supply = "vcc_core",
}
+};
- PMCR = 0x00;
-
- /* Stop 3.6MHz and drive HIGH to PCMCIA and CS */
- PCFR |= PCFR_OPDE;
+static struct regulator_init_data isl6271a_info[] = {
+ {
+ .constraints = {
+ .name = "vcc_core range",
+ .min_uV = 850000,
+ .max_uV = 1600000,
+ .always_on = 1,
+ .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
+ },
+ .consumer_supplies = isl6271a_consumers,
+ .num_consumer_supplies = ARRAY_SIZE(isl6271a_consumers),
+ }
+};
- pxa2xx_mfp_config(ARRAY_AND_SIZE(spitz_pin_config));
+static struct i2c_board_info sharpslc_pi2c_devs[] = {
+ {
+ .type = "isl6271a",
+ .addr = 0x0c,
+ .platform_data = &isl6271a_info,
+ },
+};
- pxa_set_ffuart_info(NULL);
- pxa_set_btuart_info(NULL);
- pxa_set_stuart_info(NULL);
+static void __init sharpslc_i2c_init(void)
+{
+ int size = ARRAY_SIZE(sharpslc_i2c_devs);
- spitz_init_spi();
+ /* Only Akita has the max7310 chip */
+ if (!machine_is_akita())
+ size--;
- platform_add_devices(devices, ARRAY_SIZE(devices));
- pxa_set_mci_info(&spitz_mci_platform_data);
- pxa_set_ohci_info(&spitz_ohci_platform_data);
- pxa_set_ficp_info(&spitz_ficp_platform_data);
- set_pxa_fb_info(&spitz_pxafb_info);
pxa_set_i2c_info(NULL);
+ pxa27x_set_i2c_power_info(NULL);
+ i2c_register_board_info(0, sharpslc_i2c_devs, size);
+ i2c_register_board_info(1, ARRAY_AND_SIZE(sharpslc_pi2c_devs));
}
-
-#if defined(CONFIG_MACH_AKITA) || defined(CONFIG_MACH_BORZOI)
-static struct nand_bbt_descr sharpsl_akita_bbt = {
- .options = 0,
- .offs = 4,
- .len = 1,
- .pattern = scan_ff_pattern
-};
-
-static struct nand_ecclayout akita_oobinfo = {
- .eccbytes = 24,
- .eccpos = {
- 0x5, 0x1, 0x2, 0x3, 0x6, 0x7, 0x15, 0x11,
- 0x12, 0x13, 0x16, 0x17, 0x25, 0x21, 0x22, 0x23,
- 0x26, 0x27, 0x35, 0x31, 0x32, 0x33, 0x36, 0x37},
- .oobfree = {{0x08, 0x09}}
-};
+#else
+static inline void sharpslc_i2c_init(void) {}
#endif
-#if defined(CONFIG_MACH_SPITZ) || defined(CONFIG_MACH_BORZOI)
-static void __init spitz_init(void)
+/******************************************************************************
+ * Machine init
+ ******************************************************************************/
+static void sharpslc_poweroff(void)
{
- spitz_ficp_platform_data.gpio_pwdown = SPITZ_GPIO_IR_ON;
-
-#ifdef CONFIG_MACH_BORZOI
- if (machine_is_borzoi()) {
- sharpsl_nand_platform_data.badblock_pattern = &sharpsl_akita_bbt;
- sharpsl_nand_platform_data.ecc_layout = &akita_oobinfo;
- }
-#endif
-
- platform_scoop_config = &spitz_pcmcia_config;
-
- common_init();
-
- platform_device_register(&spitzscoop2_device);
+ arm_machine_restart('g', NULL);
}
-#endif
-#ifdef CONFIG_MACH_AKITA
-/*
- * Akita IO Expander
- */
-static struct pca953x_platform_data akita_ioexp = {
- .gpio_base = AKITA_IOEXP_GPIO_BASE,
-};
+static void sharpslc_restart(char mode, const char *cmd)
+{
+ /* Bootloader magic for a reboot */
+ if ((MSC0 & 0xffff0000) == 0x7ff00000)
+ MSC0 = (MSC0 & 0xffff) | 0x7ee00000;
-static struct i2c_board_info akita_i2c_board_info[] = {
- {
- .type = "max7310",
- .addr = 0x18,
- .platform_data = &akita_ioexp,
- },
-};
+ sharpslc_poweroff();
+}
-static void __init akita_init(void)
+static void __init sharpslc_init(void)
{
- spitz_ficp_platform_data.gpio_pwdown = AKITA_GPIO_IR_ON;
+ init_gpio_reset(SPITZ_GPIO_ON_RESET, 1, 0);
+ pm_power_off = sharpslc_poweroff;
+ arm_pm_restart = sharpslc_restart;
- sharpsl_nand_platform_data.badblock_pattern = &sharpsl_akita_bbt;
- sharpsl_nand_platform_data.ecc_layout = &akita_oobinfo;
+ PMCR = 0x00;
- /* We just pretend the second element of the array doesn't exist */
- spitz_pcmcia_config.num_devs = 1;
- platform_scoop_config = &spitz_pcmcia_config;
+ /* Stop 3.6MHz and drive HIGH to PCMCIA and CS */
+ PCFR |= PCFR_OPDE;
- i2c_register_board_info(0, ARRAY_AND_SIZE(akita_i2c_board_info));
+ pxa2xx_mfp_config(ARRAY_AND_SIZE(sharpslc_pin_config));
- common_init();
+ pxa_set_ffuart_info(NULL);
+ pxa_set_btuart_info(NULL);
+ pxa_set_stuart_info(NULL);
+
+ sharpslc_spi_init();
+ sharpslc_scoop_init();
+ sharpslc_mkp_init();
+ sharpslc_keys_init();
+ sharpslc_leds_init();
+ sharpslc_mmc_init();
+ sharpslc_pcmcia_init();
+ sharpslc_irda_init();
+ sharpslc_uhc_init();
+ sharpslc_lcd_init();
+ sharpslc_nor_init();
+ sharpslc_nand_init();
+ sharpslc_i2c_init();
}
-#endif
-static void __init fixup_spitz(struct machine_desc *desc,
+static void __init sharpslc_fixup(struct machine_desc *desc,
struct tag *tags, char **cmdline, struct meminfo *mi)
{
sharpsl_save_param();
@@ -852,10 +982,10 @@ static void __init fixup_spitz(struct machine_desc *desc,
MACHINE_START(SPITZ, "SHARP Spitz")
.phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
- .fixup = fixup_spitz,
+ .fixup = sharpslc_fixup,
.map_io = pxa_map_io,
.init_irq = pxa27x_init_irq,
- .init_machine = spitz_init,
+ .init_machine = sharpslc_init,
.timer = &pxa_timer,
MACHINE_END
#endif
@@ -864,10 +994,10 @@ MACHINE_END
MACHINE_START(BORZOI, "SHARP Borzoi")
.phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
- .fixup = fixup_spitz,
+ .fixup = sharpslc_fixup,
.map_io = pxa_map_io,
.init_irq = pxa27x_init_irq,
- .init_machine = spitz_init,
+ .init_machine = sharpslc_init,
.timer = &pxa_timer,
MACHINE_END
#endif
@@ -876,10 +1006,10 @@ MACHINE_END
MACHINE_START(AKITA, "SHARP Akita")
.phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
- .fixup = fixup_spitz,
+ .fixup = sharpslc_fixup,
.map_io = pxa_map_io,
.init_irq = pxa27x_init_irq,
- .init_machine = akita_init,
+ .init_machine = sharpslc_init,
.timer = &pxa_timer,
MACHINE_END
#endif
--
1.7.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 1/3] ISL6271A voltage regulator support.
2010-06-12 12:44 [PATCH 1/3] ISL6271A voltage regulator support Marek Vasut
2010-06-12 12:44 ` [PATCH 2/3] ARM/scoop: Add CPR register bit definitions Marek Vasut
2010-06-12 12:44 ` [PATCH 3/3] pxa/spitz: Rework spitz Marek Vasut
@ 2010-06-12 17:21 ` Mark Brown
2010-06-13 10:30 ` Marek Vasut
2 siblings, 1 reply; 6+ messages in thread
From: Mark Brown @ 2010-06-12 17:21 UTC (permalink / raw)
To: linux-arm-kernel
On Sat, Jun 12, 2010 at 02:44:37PM +0200, Marek Vasut wrote:
> This device is very simple, it supports only one LDO. This single LDO is
> programmed over I2C to 16 possible voltages.
Google tells me that the device has three regulators on it - two LDOs
and one DCDC buck convertor:
http://www.intersil.com/products/deviceinfo.asp?pn=ISL6271A
While the LDOs look like they have no software control it'd be best to
provide hookup for them, even if that's just a case of instantiating the
appropriate fixed voltage regulators.
> Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
> +/* Supported voltage values for regulators */
> +static const u32 core_buck_table[] = {
> + 850000, 900000, 950000, 1000000,
> + 1050000, 1100000, 1150000, 1200000,
> + 1250000, 1300000, 1350000, 1400000,
> + 1450000, 1500000, 1550000, 1600000,
> +};
This looks like it could be replaced with a simple function rather than
a lookup table which would simplify the code.
Also, are you sure this is a buck? That's a specific technical term
usually only applied to DCDC regulators - LDOs are a different type of
regulator
> +static int __devinit isl6271a_probe(struct i2c_client *client,
> + const struct i2c_device_id *id)
> +{
> + struct regulator_init_data *init_data = client->dev.platform_data;
> + struct isl_pmic *pmic;
> + int err;
> +
> + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
> + return -EIO;
> +
> + if (!init_data)
> + return -EIO;
It'd be better to print an error message here so users know what's going
on when the device fails to appear.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/3] ISL6271A voltage regulator support.
2010-06-12 17:21 ` [PATCH 1/3] ISL6271A voltage regulator support Mark Brown
@ 2010-06-13 10:30 ` Marek Vasut
2010-06-13 14:00 ` Mark Brown
0 siblings, 1 reply; 6+ messages in thread
From: Marek Vasut @ 2010-06-13 10:30 UTC (permalink / raw)
To: linux-arm-kernel
Dne So 12. ?ervna 2010 19:21:14 Mark Brown napsal(a):
> On Sat, Jun 12, 2010 at 02:44:37PM +0200, Marek Vasut wrote:
> > This device is very simple, it supports only one LDO. This single LDO is
> > programmed over I2C to 16 possible voltages.
>
> Google tells me that the device has three regulators on it - two LDOs
> and one DCDC buck convertor:
>
> http://www.intersil.com/products/deviceinfo.asp?pn=ISL6271A
>
> While the LDOs look like they have no software control it'd be best to
> provide hookup for them, even if that's just a case of instantiating the
> appropriate fixed voltage regulators.
Is this necessary? I'd only increase the kernel size without any gain ... or am
I wrong ?
>
> > Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
> >
> > +/* Supported voltage values for regulators */
> > +static const u32 core_buck_table[] = {
> > + 850000, 900000, 950000, 1000000,
> > + 1050000, 1100000, 1150000, 1200000,
> > + 1250000, 1300000, 1350000, 1400000,
> > + 1450000, 1500000, 1550000, 1600000,
> > +};
>
> This looks like it could be replaced with a simple function rather than
> a lookup table which would simplify the code.
Will do.
>
> Also, are you sure this is a buck? That's a specific technical term
> usually only applied to DCDC regulators - LDOs are a different type of
> regulator
That's what's written in the ISL6271a TRM. On the first page, under the
"Features" section.
>
> > +static int __devinit isl6271a_probe(struct i2c_client *client,
> > + const struct i2c_device_id *id)
> > +{
> > + struct regulator_init_data *init_data = client->dev.platform_data;
> > + struct isl_pmic *pmic;
> > + int err;
> > +
> > + if (!i2c_check_functionality(client->adapter,
> > I2C_FUNC_SMBUS_BYTE_DATA)) + return -EIO;
> > +
> > + if (!init_data)
> > + return -EIO;
>
> It'd be better to print an error message here so users know what's going
> on when the device fails to appear.
Ok.
Thanks!
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/3] ISL6271A voltage regulator support.
2010-06-13 10:30 ` Marek Vasut
@ 2010-06-13 14:00 ` Mark Brown
0 siblings, 0 replies; 6+ messages in thread
From: Mark Brown @ 2010-06-13 14:00 UTC (permalink / raw)
To: linux-arm-kernel
On 13 Jun 2010, at 11:30, Marek Vasut wrote:
> Dne So 12. ?ervna 2010 19:21:14 Mark Brown napsal(a):
>> On Sat, Jun 12, 2010 at 02:44:37PM +0200, Marek Vasut wrote:
>>> This device is very simple, it supports only one LDO. This single LDO is
>>> programmed over I2C to 16 possible voltages.
>>
>> Google tells me that the device has three regulators on it - two LDOs
>> and one DCDC buck convertor:
>>
>> http://www.intersil.com/products/deviceinfo.asp?pn=ISL6271A
>>
>> While the LDOs look like they have no software control it'd be best to
>> provide hookup for them, even if that's just a case of instantiating the
>> appropriate fixed voltage regulators.
> Is this necessary? I'd only increase the kernel size without any gain ... or am
> I wrong ?
If devices are connected to the fixed supplies they still need to be told about
the connection so they can interact well with the regulator API.
There's also the fact that your description of the device in the changelog is
rather inaccurate - the device has three regulators, not just a single LDO, and
the regulator that is software controllable is a DCDC buck convertor not a LDO.
>> Also, are you sure this is a buck? That's a specific technical term
>> usually only applied to DCDC regulators - LDOs are a different type of
>> regulator
> That's what's written in the ISL6271a TRM. On the first page, under the
> "Features" section.
That says there is one buck and 2 LDOs and it rather looks like the software
controllable regulator is the buck.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2010-06-13 14:00 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-06-12 12:44 [PATCH 1/3] ISL6271A voltage regulator support Marek Vasut
2010-06-12 12:44 ` [PATCH 2/3] ARM/scoop: Add CPR register bit definitions Marek Vasut
2010-06-12 12:44 ` [PATCH 3/3] pxa/spitz: Rework spitz Marek Vasut
2010-06-12 17:21 ` [PATCH 1/3] ISL6271A voltage regulator support Mark Brown
2010-06-13 10:30 ` Marek Vasut
2010-06-13 14:00 ` Mark Brown
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).