0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/init.h>
0009 #include <linux/kernel.h>
0010 #include <linux/mfd/core.h>
0011 #include <linux/mfd/rsmu.h>
0012 #include <linux/module.h>
0013 #include <linux/of.h>
0014 #include <linux/regmap.h>
0015 #include <linux/slab.h>
0016 #include <linux/spi/spi.h>
0017
0018 #include "rsmu.h"
0019
0020 #define RSMU_CM_PAGE_ADDR 0x7C
0021 #define RSMU_SABRE_PAGE_ADDR 0x7F
0022 #define RSMU_HIGHER_ADDR_MASK 0xFF80
0023 #define RSMU_HIGHER_ADDR_SHIFT 7
0024 #define RSMU_LOWER_ADDR_MASK 0x7F
0025
0026 static int rsmu_read_device(struct rsmu_ddata *rsmu, u8 reg, u8 *buf, u16 bytes)
0027 {
0028 struct spi_device *client = to_spi_device(rsmu->dev);
0029 struct spi_transfer xfer = {0};
0030 struct spi_message msg;
0031 u8 cmd[256] = {0};
0032 u8 rsp[256] = {0};
0033 int ret;
0034
0035 cmd[0] = reg | 0x80;
0036 xfer.rx_buf = rsp;
0037 xfer.len = bytes + 1;
0038 xfer.tx_buf = cmd;
0039 xfer.bits_per_word = client->bits_per_word;
0040 xfer.speed_hz = client->max_speed_hz;
0041
0042 spi_message_init(&msg);
0043 spi_message_add_tail(&xfer, &msg);
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057 ret = spi_sync(client, &msg);
0058 if (ret >= 0)
0059 memcpy(buf, &rsp[1], xfer.len-1);
0060
0061 return ret;
0062 }
0063
0064 static int rsmu_write_device(struct rsmu_ddata *rsmu, u8 reg, u8 *buf, u16 bytes)
0065 {
0066 struct spi_device *client = to_spi_device(rsmu->dev);
0067 struct spi_transfer xfer = {0};
0068 struct spi_message msg;
0069 u8 cmd[256] = {0};
0070
0071 cmd[0] = reg;
0072 memcpy(&cmd[1], buf, bytes);
0073
0074 xfer.len = bytes + 1;
0075 xfer.tx_buf = cmd;
0076 xfer.bits_per_word = client->bits_per_word;
0077 xfer.speed_hz = client->max_speed_hz;
0078 spi_message_init(&msg);
0079 spi_message_add_tail(&xfer, &msg);
0080
0081 return spi_sync(client, &msg);
0082 }
0083
0084
0085
0086
0087
0088
0089 static int rsmu_write_page_register(struct rsmu_ddata *rsmu, u16 reg)
0090 {
0091 u8 page_reg;
0092 u8 buf[2];
0093 u16 bytes;
0094 u16 page;
0095 int err;
0096
0097 switch (rsmu->type) {
0098 case RSMU_CM:
0099 page_reg = RSMU_CM_PAGE_ADDR;
0100 page = reg & RSMU_HIGHER_ADDR_MASK;
0101 buf[0] = (u8)(page & 0xff);
0102 buf[1] = (u8)((page >> 8) & 0xff);
0103 bytes = 2;
0104 break;
0105 case RSMU_SABRE:
0106 page_reg = RSMU_SABRE_PAGE_ADDR;
0107 page = reg >> RSMU_HIGHER_ADDR_SHIFT;
0108 buf[0] = (u8)(page & 0xff);
0109 bytes = 1;
0110 break;
0111 default:
0112 dev_err(rsmu->dev, "Unsupported RSMU device type: %d\n", rsmu->type);
0113 return -ENODEV;
0114 }
0115
0116
0117 if (rsmu->page == page)
0118 return 0;
0119
0120 err = rsmu_write_device(rsmu, page_reg, buf, bytes);
0121 if (err)
0122 dev_err(rsmu->dev, "Failed to set page offset 0x%x\n", page);
0123 else
0124
0125 rsmu->page = page;
0126
0127 return err;
0128 }
0129
0130 static int rsmu_reg_read(void *context, unsigned int reg, unsigned int *val)
0131 {
0132 struct rsmu_ddata *rsmu = spi_get_drvdata((struct spi_device *)context);
0133 u8 addr = (u8)(reg & RSMU_LOWER_ADDR_MASK);
0134 int err;
0135
0136 err = rsmu_write_page_register(rsmu, reg);
0137 if (err)
0138 return err;
0139
0140 err = rsmu_read_device(rsmu, addr, (u8 *)val, 1);
0141 if (err)
0142 dev_err(rsmu->dev, "Failed to read offset address 0x%x\n", addr);
0143
0144 return err;
0145 }
0146
0147 static int rsmu_reg_write(void *context, unsigned int reg, unsigned int val)
0148 {
0149 struct rsmu_ddata *rsmu = spi_get_drvdata((struct spi_device *)context);
0150 u8 addr = (u8)(reg & RSMU_LOWER_ADDR_MASK);
0151 u8 data = (u8)val;
0152 int err;
0153
0154 err = rsmu_write_page_register(rsmu, reg);
0155 if (err)
0156 return err;
0157
0158 err = rsmu_write_device(rsmu, addr, &data, 1);
0159 if (err)
0160 dev_err(rsmu->dev,
0161 "Failed to write offset address 0x%x\n", addr);
0162
0163 return err;
0164 }
0165
0166 static const struct regmap_config rsmu_cm_regmap_config = {
0167 .reg_bits = 16,
0168 .val_bits = 8,
0169 .max_register = 0xD000,
0170 .reg_read = rsmu_reg_read,
0171 .reg_write = rsmu_reg_write,
0172 .cache_type = REGCACHE_NONE,
0173 };
0174
0175 static const struct regmap_config rsmu_sabre_regmap_config = {
0176 .reg_bits = 16,
0177 .val_bits = 8,
0178 .max_register = 0x400,
0179 .reg_read = rsmu_reg_read,
0180 .reg_write = rsmu_reg_write,
0181 .cache_type = REGCACHE_NONE,
0182 };
0183
0184 static int rsmu_spi_probe(struct spi_device *client)
0185 {
0186 const struct spi_device_id *id = spi_get_device_id(client);
0187 const struct regmap_config *cfg;
0188 struct rsmu_ddata *rsmu;
0189 int ret;
0190
0191 rsmu = devm_kzalloc(&client->dev, sizeof(*rsmu), GFP_KERNEL);
0192 if (!rsmu)
0193 return -ENOMEM;
0194
0195 spi_set_drvdata(client, rsmu);
0196
0197 rsmu->dev = &client->dev;
0198 rsmu->type = (enum rsmu_type)id->driver_data;
0199
0200
0201 switch (rsmu->type) {
0202 case RSMU_CM:
0203 cfg = &rsmu_cm_regmap_config;
0204 break;
0205 case RSMU_SABRE:
0206 cfg = &rsmu_sabre_regmap_config;
0207 break;
0208 default:
0209 dev_err(rsmu->dev, "Unsupported RSMU device type: %d\n", rsmu->type);
0210 return -ENODEV;
0211 }
0212
0213 rsmu->regmap = devm_regmap_init(&client->dev, NULL, client, cfg);
0214 if (IS_ERR(rsmu->regmap)) {
0215 ret = PTR_ERR(rsmu->regmap);
0216 dev_err(rsmu->dev, "Failed to allocate register map: %d\n", ret);
0217 return ret;
0218 }
0219
0220 return rsmu_core_init(rsmu);
0221 }
0222
0223 static void rsmu_spi_remove(struct spi_device *client)
0224 {
0225 struct rsmu_ddata *rsmu = spi_get_drvdata(client);
0226
0227 rsmu_core_exit(rsmu);
0228 }
0229
0230 static const struct spi_device_id rsmu_spi_id[] = {
0231 { "8a34000", RSMU_CM },
0232 { "8a34001", RSMU_CM },
0233 { "82p33810", RSMU_SABRE },
0234 { "82p33811", RSMU_SABRE },
0235 {}
0236 };
0237 MODULE_DEVICE_TABLE(spi, rsmu_spi_id);
0238
0239 static const struct of_device_id rsmu_spi_of_match[] = {
0240 { .compatible = "idt,8a34000", .data = (void *)RSMU_CM },
0241 { .compatible = "idt,8a34001", .data = (void *)RSMU_CM },
0242 { .compatible = "idt,82p33810", .data = (void *)RSMU_SABRE },
0243 { .compatible = "idt,82p33811", .data = (void *)RSMU_SABRE },
0244 {}
0245 };
0246 MODULE_DEVICE_TABLE(of, rsmu_spi_of_match);
0247
0248 static struct spi_driver rsmu_spi_driver = {
0249 .driver = {
0250 .name = "rsmu-spi",
0251 .of_match_table = of_match_ptr(rsmu_spi_of_match),
0252 },
0253 .probe = rsmu_spi_probe,
0254 .remove = rsmu_spi_remove,
0255 .id_table = rsmu_spi_id,
0256 };
0257
0258 static int __init rsmu_spi_init(void)
0259 {
0260 return spi_register_driver(&rsmu_spi_driver);
0261 }
0262 subsys_initcall(rsmu_spi_init);
0263
0264 static void __exit rsmu_spi_exit(void)
0265 {
0266 spi_unregister_driver(&rsmu_spi_driver);
0267 }
0268 module_exit(rsmu_spi_exit);
0269
0270 MODULE_DESCRIPTION("Renesas SMU SPI driver");
0271 MODULE_LICENSE("GPL");