27
27
/* OP MODE require at least 153 us to clear regs */
28
28
#define LP55XX_CMD_SLEEP 200
29
29
30
- #define LP55xx_PROGRAM_LENGTH 32
30
+ #define LP55xx_PROGRAM_PAGES 16
31
+ #define LP55xx_MAX_PROGRAM_LENGTH (LP55xx_BYTES_PER_PAGE * 4) /* 128 bytes (4 pages) */
31
32
32
33
/*
33
34
* Program Memory Operations
@@ -172,12 +173,16 @@ int lp55xx_update_program_memory(struct lp55xx_chip *chip,
172
173
{
173
174
enum lp55xx_engine_index idx = chip -> engine_idx ;
174
175
const struct lp55xx_device_config * cfg = chip -> cfg ;
175
- u8 pattern [LP55xx_PROGRAM_LENGTH ] = { };
176
+ u8 pattern [LP55xx_MAX_PROGRAM_LENGTH ] = { };
176
177
u8 start_addr = cfg -> prog_mem_base .addr ;
177
- int i = 0 , offset = 0 ;
178
- int ret ;
178
+ int page , i = 0 , offset = 0 ;
179
+ int program_length , ret ;
180
+
181
+ program_length = LP55xx_BYTES_PER_PAGE ;
182
+ if (cfg -> pages_per_engine )
183
+ program_length *= cfg -> pages_per_engine ;
179
184
180
- while ((offset < size - 1 ) && (i < LP55xx_PROGRAM_LENGTH )) {
185
+ while ((offset < size - 1 ) && (i < program_length )) {
181
186
unsigned int cmd ;
182
187
int nrchars ;
183
188
char c [3 ];
@@ -206,12 +211,20 @@ int lp55xx_update_program_memory(struct lp55xx_chip *chip,
206
211
* For LED chip that support page, PAGE is already set in load_engine.
207
212
*/
208
213
if (!cfg -> pages_per_engine )
209
- start_addr += LP55xx_PROGRAM_LENGTH * idx ;
214
+ start_addr += LP55xx_BYTES_PER_PAGE * idx ;
210
215
211
- for (i = 0 ; i < LP55xx_PROGRAM_LENGTH ; i ++ ) {
212
- ret = lp55xx_write (chip , start_addr + i , pattern [i ]);
213
- if (ret )
214
- return - EINVAL ;
216
+ for (page = 0 ; page < program_length / LP55xx_BYTES_PER_PAGE ; page ++ ) {
217
+ /* Write to the next page each 32 bytes (if supported) */
218
+ if (cfg -> pages_per_engine )
219
+ lp55xx_write (chip , LP55xx_REG_PROG_PAGE_SEL ,
220
+ LP55xx_PAGE_OFFSET (idx , cfg -> pages_per_engine ) + page );
221
+
222
+ for (i = 0 ; i < LP55xx_BYTES_PER_PAGE ; i ++ ) {
223
+ ret = lp55xx_write (chip , start_addr + i ,
224
+ pattern [i + (page * LP55xx_BYTES_PER_PAGE )]);
225
+ if (ret )
226
+ return - EINVAL ;
227
+ }
215
228
}
216
229
217
230
return size ;
@@ -224,13 +237,19 @@ EXPORT_SYMBOL_GPL(lp55xx_update_program_memory);
224
237
225
238
void lp55xx_firmware_loaded_cb (struct lp55xx_chip * chip )
226
239
{
240
+ const struct lp55xx_device_config * cfg = chip -> cfg ;
227
241
const struct firmware * fw = chip -> fw ;
242
+ int program_length ;
243
+
244
+ program_length = LP55xx_BYTES_PER_PAGE ;
245
+ if (cfg -> pages_per_engine )
246
+ program_length *= cfg -> pages_per_engine ;
228
247
229
248
/*
230
249
* the firmware is encoded in ascii hex character, with 2 chars
231
250
* per byte
232
251
*/
233
- if (fw -> size > LP55xx_PROGRAM_LENGTH * 2 ) {
252
+ if (fw -> size > program_length * 2 ) {
234
253
dev_err (& chip -> cl -> dev , "firmware data size overflow: %zu\n" ,
235
254
fw -> size );
236
255
return ;
@@ -1276,7 +1295,7 @@ static struct lp55xx_platform_data *lp55xx_of_populate_pdata(struct device *dev,
1276
1295
int lp55xx_probe (struct i2c_client * client )
1277
1296
{
1278
1297
const struct i2c_device_id * id = i2c_client_get_device_id (client );
1279
- int ret ;
1298
+ int program_length , ret ;
1280
1299
struct lp55xx_chip * chip ;
1281
1300
struct lp55xx_led * led ;
1282
1301
struct lp55xx_platform_data * pdata = dev_get_platdata (& client -> dev );
@@ -1300,6 +1319,17 @@ int lp55xx_probe(struct i2c_client *client)
1300
1319
}
1301
1320
}
1302
1321
1322
+ /* Validate max program page */
1323
+ program_length = LP55xx_BYTES_PER_PAGE ;
1324
+ if (chip -> cfg -> pages_per_engine )
1325
+ program_length *= chip -> cfg -> pages_per_engine ;
1326
+
1327
+ /* support a max of 128bytes */
1328
+ if (program_length > LP55xx_MAX_PROGRAM_LENGTH ) {
1329
+ dev_err (& client -> dev , "invalid pages_per_engine configured\n" );
1330
+ return - EINVAL ;
1331
+ }
1332
+
1303
1333
led = devm_kcalloc (& client -> dev ,
1304
1334
pdata -> num_channels , sizeof (* led ), GFP_KERNEL );
1305
1335
if (!led )
0 commit comments